gpt4 book ai didi

java - @SpringBootTest : @MockBean not injected when multiple test classes

转载 作者:行者123 更新时间:2023-12-04 11:40:24 25 4
gpt4 key购买 nike

我想编写 Controller 测试来测试我的注释。到目前为止,我所读到的是 RestAssured 是其中一种方法。
当我只有一个 Controller 测试时,它工作顺利。但是,当有 2 个或更多 Controller 测试类时,@MockBeans 似乎没有正确使用。
根据测试执行顺序,第一个测试类中的所有测试都成功,而所有其他测试都失败。
在接下来的测试运行中,首先执行 PotatoControllerTest,然后是 FooControllerTest。

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"test", "httptest"})
class FooControllerTest {

@MockBean
protected FooService mockFooService;

@MockBean
protected BarService mockBarService;

@LocalServerPort
protected int port;

@BeforeEach
public void setup() {
RestAssured.port = port;
RestAssured.authentication = basic(TestSecurityConfiguration.ADMIN_USERNAME, TestSecurityConfiguration.ADMIN_PASSWORD);
RestAssured.requestSpecification = new RequestSpecBuilder()
.setContentType(ContentType.JSON)
.setAccept(ContentType.JSON)
.build();
}

@SneakyThrows
@Test
void deleteFooNotExists() {
final Foo foo = TestUtils.generateTestFoo();
Mockito.doThrow(new DoesNotExistException("missing")).when(mockFooService).delete(foo.getId(), foo.getVersion());

RestAssured.given()
.when().delete("/v1/foo/{id}/{version}", foo.getId(), foo.getVersion())
.then()
.statusCode(HttpStatus.NOT_FOUND.value());
Mockito.verify(mockFooService, times(1)).delete(foo.getId(), foo.getVersion());
}

...
}
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles({"test", "httptest"})
class PotatoControllerTest {

@MockBean
protected PotatoService mockPotatoService;

@LocalServerPort
protected int port;

@BeforeEach
public void setup() {
RestAssured.port = port;
RestAssured.authentication = basic(TestSecurityConfiguration.ADMIN_USERNAME, TestSecurityConfiguration.ADMIN_PASSWORD);
RestAssured.requestSpecification = new RequestSpecBuilder()
.setContentType(ContentType.JSON)
.setAccept(ContentType.JSON)
.build();
}

...

}
Wanted but not invoked:
fooService bean.delete(
"10e76ae4-ec1b-49ce-b162-8a5c587de2a8",
"06db13f1-c4cd-435d-9693-b94c26503d40"
);
-> at com.xxx.service.FooService.delete(FooService.java:197)
Actually, there were zero interactions with this mock.
我试图用一个常见的 ControllerTestBase 修复它它配置所有模拟和扩展基类的所有其他 Controller 测试。这在我的机器上运行良好,但例如不在管道中。所以我想它不是很稳定。
为什么 Spring 不使用模拟重新加载上下文?这是测试我的 Controller 的“最佳”方式吗?

最佳答案

仅使用 MockMvc 会更容易、更快捷。 .
你可以为你想要的 Controller 创建一个独立的设置并进行额外的配置(比如设置异常解析器)。您还可以轻松注入(inject)模拟:

@Before
public void init() {
MyController myController = new MyController(mock1, mock2, ...);
MockMvc mockMvc =
MockMvcBuilders.standaloneSetup(myController)
.setHandlerExceptionResolvers(...)
.build();
}
之后,您可以轻松调用端点:
MvcResult result = mockMvc.perform(
get("/someApi"))
.andExpect(status().isOk)
.andReturn();
可以像您已经知道的那样对响应进行其他验证。
编辑 :作为旁注 - 这旨在显式测试您的 web 层。如果您想在应用程序堆栈中进行某种更深入的集成测试,还包括业务逻辑,这不是正确的方法。

关于java - @SpringBootTest : @MockBean not injected when multiple test classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62890075/

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