2017-04-12 8 views
0

ich ein Szenario wie folgt habe, dass ich nicht sicher bin, von wo aus zu starten,JUnit Gabe von Parametern zwischen Klasse

Dateinamen als Argument param übergeben werden soll, wenn die JAR-Datei

läuft zum Beispiel sagen, Ich möchte eine Reihe von Daten aus externen Datei testen und ich habe eine Super-Klasse (Test Suite), die Nummer eins und Nummer zwei haben

und es gibt zwei Test-Klassen, die diese Klasse erweitern und die Tests durchführen sollten.

Ich bin gerade neu bei JUnit, daher fehlen mir viele Konzepte und ich brauche jemandes Hilfe.

Ich habe Klasse CoreManager, die die Haupt

public static void main(String[] args) 
    { 
     if (Arrays.asList(args).contains("Import")) 
     { 
     accountInfo = new ArrayList<>(); 
     int ImportIndex = Arrays.asList(args).indexOf("Import"); 
     String fileName = args[ImportIndex+1]; 
     if (fileName.contains("xml")) 
     { 
      ParseXML parseXML = new ParseXML(); 
      accountInfo = parseXML.ParseAccounts(fileName); 

      Result result = JUnitCore.runClasses(LoginTestSuite.class); 

      for (Failure failure : result.getFailures()) { 
       System.out.println(failure.toString()); 
      } 

      System.out.println(result.wasSuccessful()); 
     } 
    } 
} 

And Suite Klasse

@RunWith(MockitoJUnitRunner.class) 

@Suite.SuiteClasses({ 
    Login.class, 
    SignUp.class 

})

public class LoginTestSuite { 
public static WebDriver driver; 
public static ArrayList<AccountInfo> Account; 
public static int SecondsToWait; 

public LoginTestSuite(WebDriver driver,ArrayList<AccountInfo> Account,int 
secondsToWait) 
{ 
this.Account = Account; 
this.SecondsToWait = secondsToWait; 
this.driver = driver; 
} 

}

und Testklasse führt

public class Login {

private static WebDriver driver; 
private static ArrayList<AccountInfo> Account; 
private static int SecondsToWait; 
private static final Logger logger = Logger.getLogger(Login.class.getName()); 



@BeforeClass 
public void init(){ 
    this.driver = LoginTestSuite.driver; 
    this.Account = LoginTestSuite.Account; 
    this.SecondsToWait = LoginTestSuite.SecondsToWait; 
} 

@Before 
public void Setup(){ 

    driver.manage().window().maximize(); 
    driver.manage().timeouts().implicitlyWait(SecondsToWait, 
    TimeUnit.SECONDS); 
    driver.manage().timeouts().pageLoadTimeout(SecondsToWait, 
    TimeUnit.SECONDS); 
} 

@After 
public void TearDown(){ 
    driver.quit(); 
} 



@Test 
public void TestUserLogin() throws Exception 
{ 
    // Logic 

} 
+0

Sie einen Code schreiben sollte * erläutern * –

+0

zeigen einige Code plz – VedX

+0

es tun und dann stellen Sie konkrete Frage –

Antwort

1

Ihr Code sieht verworren und enthält mehrere schlechte Qualität Konstrukte. Vor allem sehe ich keinen Unterschied zwischen Testcode und Produktionscode. Welcher ist welcher?

Diese Produktion Code sein könnte:

public class App { 

    public static void main(String[] args) {  
      AccountReader accountReader = new AccountReader(); 
      List<AccountInfo> accounts = accountReader.read(args); 
      // maybe do something with those accounts?       
    } 
} 

public class AccountReader { 

    private ParseXML parseXML; 

    public AccountReader() { 
     this.parseXML = new ParseXML(); 
    } 

    // extra constructor to allow dependency injection from test 
    protected AccountReader(ParseXML parseXML) { 
     this.parseXML = parseXML; 
    } 

    public List<AccountInfo> read(String[] args) {   
      return parseXML.ParseAccounts(getFileName(args));   
    } 

    private String getFileName(String[] args) { 
     List<String> arguments = Arrays.asList(args);   
     int importIndex = arguments.indexOf("Import");  
     if (importIndex < 0) { 
      throw new RuntimeException("Missing Import argument"); 
     }   
     int fileNameIndex = importIndex + 1; 
     if (fileNameIndex >= arguments.size()) { 
      throw new RuntimeException("Missing fileName argument"); 
     } 
     String fileName = args[fileNameIndex]; 
     if (!fileName.endsWith(".xml")) { 
      throw new RuntimeException("Can only import XML files"); 
     } 
     return fileName; 
    } 

} 

Und dies ein Test für sie sein könnte:

public AccountReaderTest { 

    private AccountReader instance; 
    @Mock // creates a mock instance which we can give desired behavior 
    private ParseXML parseXML; 
    @Mock 
    List<AccountInfo> accounts; 

    @Before 
    public void setUp() { 
     instance = new AccountReader(parseXML); 
    } 

    @Test 
    public void testHappy() {   
     // SETUP 
     String fileName = "test.xml"; 
     // specify desired behavior of mock ParseXML instance 
     when(parseXML.ParseAccounts(fileName).thenReturn(accounts); 

     // CALL 
     List<AccountInfo> result = instance.read(new String[] { "Import", fileName }); 

     // VERIFY 
     assertEquals(accounts, result); 
    } 

    @Test(expected = RuntimeException.class) 
    public void testMissingImport() {   
     instance.read(new String[] { "notImport" }); 
    } 

    @Test(expected = RuntimeException.class) 
    public void testMissingFileName() {   
     instance.read(new String[] { "Import" }); 
    } 

    @Test(expected = RuntimeException.class) 
    public void testNotXml() {   
     instance.read(new String[] { "Import", "test.properties"}); 
    } 
} 
+0

Ich habe noch nichts optimiert. Ich möchte die folgenden erreichen 1- Haben Sie eine Funktion, die als "Haupt" die Pars in Java-Jar-Datei übergeben analysiert nach der Veröffentlichung 2- die Argumente sollten enthalten, welche Datei zu analysieren und übergeben Sie die geparste Datei zu der Testsuite 3- Die Testsuite wird dann ALLE mit ihr verbundenen Testfälle ausführen. –

Verwandte Themen