Ich habe einen Arbeitstest für JUnit mit Mockito gemacht und versucht, es an die Arbeit mit TestNG anzupassen, aber seltsamerweise mit TestNG nur ein Test funktioniert.Verwenden von Mockito mit TestNG
Ich denke, es ist irgendwie mit dem Zurücksetzen der Mocks in Verbindung, aber ich habe herum mit Versuchen versucht, Mockito.reset aufrufen und BeforeMethod und BeforeClass und verschiedene Kombinationen zu verwenden, aber immer noch nur einen Test zu bestehen.
Was muss ich tun, damit der Test funktioniert?
@BeforeClass
public void setUp() {
MockitoAnnotations.initMocks(this);
mockMvc = MockMvcBuilders.standaloneSetup(calculatorController).build();
}
@AfterMethod
public void reset() {
Mockito.reset(calculatorService);
}
@Test
public void addFunctionTest() throws Exception {
Assert.assertNotNull(calculatorController);
Result expectedResult = new Result();
expectedResult.setResult(10);
when(calculatorService.add(anyInt(), anyInt())).thenReturn(expectedResult);
mockMvc.perform(get("/calculator/add").accept(MediaType.APPLICATION_JSON_VALUE)
.param("val1", "100")
.param("val2", "100"))
.andExpect(content().contentType("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.result", equalTo(10)));
verify(calculatorService, times(1)).add(anyInt(), anyInt());
}
@Test
public void subtractFunctionTest() throws Exception {
Assert.assertNotNull(calculatorController);
Result expectedResult = new Result();
expectedResult.setResult(90);
when(calculatorService.subtract(anyInt(), anyInt())).thenReturn(expectedResult);
mockMvc.perform(get("/calculator/subtract").accept(MediaType.APPLICATION_JSON_VALUE)
.param("val1", "100")
.param("val2", "10"))
.andExpect(content().contentType("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.result", equalTo(90)));
verify(calculatorService, times(1)).subtract(anyInt(), anyInt());
}
Der zweite Test scheint immer bei Behauptungen fehlzuschlagen, dass entweder der Inhaltstyp nicht festgelegt ist oder das erwartete Ergebnis falsch ist.
Es scheint, als ob die Antwort für den ersten Test irgendwie im zweiten Test ausgewertet wird und so offensichtlich falsch ist!
Ich weiß, dass der Controller und der Service wie erwartet funktionieren und genau die gleichen Tests, die mit jUnit laufen, funktionieren in Ordnung.
Ich habe es geschafft, wenn sie richtig auszuführen, um die Tests zu bekommen nur die folgende ich tun:
@BeforeGroups("subtract")
public void reset() {
Mockito.reset(calculatorService);
mockMvc = MockMvcBuilders.standaloneSetup(calculatorController).build();
}
@Test(groups = "subtract")
public void subtractFunctionTest() throws Exception {
System.out.println("***** IN METHOD *****");
Assert.assertNotNull(calculatorController);
Result expectedResult = new Result();
expectedResult.setResult(90);
when(calculatorService.subtract(anyInt(), anyInt())).thenReturn(expectedResult);
//Perform HTTP Get for the homepage
mockMvc.perform(get("/calculator/subtract").accept(MediaType.APPLICATION_JSON_VALUE)
.param("val1", "100")
.param("val2", "10"))
.andExpect(content().contentType("application/json"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.result", equalTo(90)));
//Verify that the service method was only called one time
verify(calculatorService, times(1)).subtract(anyInt(), anyInt());
}
Das bedeutet, dass ich, obwohl eine dieser Reset-Methoden für jede Testmethode hinzufügen müssen, und ich muss dann eine Gruppe pro Testmethode, die nicht korrekt erscheint.
Welche Bibliothek verwenden Sie für Assertions ('Result expectedResult = new Result()')? –
Sie setzen nach jeder Methode einen Mock zurück, aber Sie tun nichts mit 'mocMvc'. Kann dies Ihre Tests beeinflussen? Kannst du das überprüfen, indem du '@ BeforeClass' in' @ BeforeMethod' änderst? –
Hallo Eugen, ich habe versucht herumzuspielen und es funktionierten keine Kombinationen. Ich werde meinen Beitrag mit dem aktualisieren, was ich geschafft habe zu arbeiten, aber es würde eine Menge Code-Wiederholung bedeuten. – berimbolo