Я взял рабочий тест, написанный для JUnit, используя Mockito и попытался адаптировать его для работы с TestNG, но, как ни странно, с помощью TestNG будет работать только один тест.Использование Mockito с TestNG
Я думаю, что это как-то связано с сбросом макетов, но я играл с попыткой вызвать Mockito.reset и использовать BeforeMethod и BeforeClass и различные комбинации, но все же может пройти только один тест.
Что мне нужно для того, чтобы тест работал?
@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());
}
Второй тест, как правило, не срабатывает при утверждении, что либо тип содержимого не установлен, либо ожидаемый результат является неправильным.
Кажется, что ответ на первый тест как-то оценивается во втором тесте, и, очевидно, это неправильно!
Я знаю, что контроллер и служба работают, как ожидалось, и те же самые тесты, выполняемые с jUnit, действительно работают нормально.
мне удалось получить тесты для выполнения должным образом только тогда, когда я делаю следующее:
@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());
}
Это означает, что мне нужно добавить один из этих сброса методов для каждого метода испытаний, хотя и тогда я нужна группа за каждый метод тестирования, который не кажется правильным.
Какую библиотеку вы используете для утверждений ('Результат ожидаетсяResult = new Result()')? –
Вы возвращаете макет после каждого метода, но вы ничего не делаете с 'mocMvc'. Может ли это повлиять на ваши тесты? Можете ли вы проверить, что с изменением '@ BeforeClass' на' @ BeforeMethod' –
Привет, Евгений, я пробовал играть и никаких комбинаций не работал. Я обновляю свой пост тем, что мне удалось получить, но это будет означать много повторений кода. – berimbolo