gpt4 book ai didi

spring - 在 TestNG 中使用 Mockito

转载 作者:行者123 更新时间:2023-12-04 17:45:13 25 4
gpt4 key购买 nike

我使用 Mockito 为 JUnit 编写了一个工作测试,并尝试将其调整为与 TestNG 一起使用,但奇怪的是使用 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());
}

第二个测试似乎总是在断言内容类型未设置或预期结果错误时失败。

第一个测试的响应似乎在第二个测试中以某种方式进行了评估,因此显然是错误的!

我知道 Controller 和服务按预期工作,使用 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());
}

这意味着我需要为每个测试方法添加这些重置方法之一,然后我需要每个测试方法一个组,这似乎不正确。

最佳答案

这些框架的行为有所不同:

  • JUnit 为其每个测试方法创建一个新的类实例。这意味着这些字段在测试之间不共享。
  • 但是 TestNG 只创建一个对象,因此字段中的状态在 @Test 之间共享。 s

  • 对于 Mockito,您需要在每个测试方法之前初始化模拟,以便状态不会在两个 @Test 之间共享在 TestNG 中:
    @BeforeMethod
    public void init() {
    MockitoAnnotations.initMocks(this);
    }

    对于 JUnit,它开箱即用,因为第二个 @Test有自己的领域和自己的模拟。

    关于spring - 在 TestNG 中使用 Mockito,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37591644/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com