在 SpringBoot API 中测试时控制器出现 NullPointerException - 模拟
NullPointerException on controller when testing in SpringBoot API - Mocking
我不知道为什么,但是当我尝试使用 MVC 从控制器测试我的任何方法时,我的代码给了我一个 nullPointerException 错误。这里我放了部分代码:
我的控制器(仅限第一种方法):
@RestController
@RequestMapping(path = "/companias")
public class ControllerAPI {
@Autowired
private final CompaniaServiceImpl companiaService;
public ControllerAPI(CompaniaServiceImpl companiaService) {
this.companiaService = companiaService;
}
@ResponseStatus(HttpStatus.OK)
@GetMapping("/{companiaId}/{field_name}")
public Map<String, List<Object>> getByField(
@PathVariable("companiaId") Long companiaId,
@PathVariable("field_name") String fieldName) {
return companiaService.getCompaniaByfield(companiaId, fieldName);
}
这是我的服务(我想模拟的那个):
@Service
@Slf4j
public class CompaniaServiceImpl implements CompaniaService {
private final CompaniaRepository companiaRepository;
private final DefaultGroupRepository defaultGroupRepository;
private final OfficeRepository officeRepository;
@Autowired
public CompaniaServiceImpl(CompaniaRepository companiaRepository, DefaultGroupRepository defaultGroupRepository, OfficeRepository officeRepository) {
this.companiaRepository = companiaRepository;
this.defaultGroupRepository = defaultGroupRepository;
this.officeRepository = officeRepository;
}
public Map<String, List<Object>> getCompaniaByfield(Long companiaId, String fieldName) {
if (companiaRepository.existsById(companiaId)) {
Map<String, Function<Compania, Object>> mapCompania = Map.of(
"name", Compania::getName,
"dominio", Compania::getDominio,
"altas", Compania::getAltas,
"bajas", Compania::getBajas
);
Compania c = companiaRepository.findCompaniaById(companiaId);
Function<Compania, Object> retriever = mapCompania.get(fieldName);
return Collections.singletonMap("success", List.of(retriever.apply(c)));
}
else throw new IllegalStateException(
"Compania con id (" + companiaId + ") no existe"
);
}
这是我的控制器测试:
@ExtendWith(SpringExtension.class)
@ContextConfiguration
class ControllerAPITest {
String token = "xxx";
@InjectMocks
private ControllerAPI controllerAPI;
private CompaniaServiceImpl companiaService = Mockito.mock(CompaniaServiceImpl.class);
private MockMvc mockMvc;
@Before
public void setup() throws Exception{
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controllerAPI).build();
}
@Test
void getByField() throws Exception {
Map<String, List<Object>> response = Collections.singletonMap("success", List.of("nombre1"));
Mockito.when(companiaService.getCompaniaByfield(1L,"name")).thenReturn(response);
this.mockMvc.perform(
get("/companias/{companiaId}/{field_name}", 1L, "name")
.header("authorization", "Bearer " + token)
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.success[0]").isNotEmpty())
.andExpect(jsonPath("$.success[0]").value("nombre1"));
}
以及给我的 NullPointerException 错误:
java.lang.NullPointerException
at database.configuration.controller.ControllerAPITest.getByField(ControllerAPITest.java:69)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod[=14=](ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke[=14=](ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:212)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
它在 this.mockMvc.perform( 行中给了我这个错误,我不知道为什么无法模拟我的服务。如果你能帮助我,我将不胜感激
测试中的主要问题是您在单个测试中混合了 JUnit 4 注释和 JUnit5。 @Before
来自 JUnit4,因此设置永远不会是 运行,因此不会创建依赖项或模拟。因此 NullPointerException
因为没有注入任何东西。
在您的代码中,您应该使用 CompaniaService
接口而不是 CompaniaServiceImpl
。您已经定义了一个接口,您应该使用它来发挥您的优势。
更换控制器。
@RestController
@RequestMapping(path = "/companias")
public class ControllerAPI {
private final CompaniaService companiaService;
public ControllerAPI(CompaniaService companiaService) {
this.companiaService = companiaService;
}
你不需要 @Autowired
字段,因为注入是通过构造函数完成的!
现在,对于测试,您可以做几件事。
将@Before
替换为@BeforeEach
,这是标记方法的JUnit5注解。您不需要 @ExtendsWith
和 @ContextConfiguration
.
而不是 @ExtendsWith(SpringExtension.class)
使用 MockitoExtension
,使用 @BeforeEach
但不初始化模拟。
使用 @WebMvcTest
和 @MockBean
并让 Spring Boot 为您处理注入和模拟创建。
使用正确的注释
class ControllerAPITest {
String token = "xxx";
@InjectMocks
private ControllerAPI controllerAPI;
@Mock
private CompaniaService companiaService;
private MockMvc mockMvc;
@BeforeEach
public void setup() throws Exception{
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controllerAPI).build();
}
@Test
void getByField() throws Exception { ... }
使用MockitoExtension
@ExtendsWith(MockitoExtension.class)
class ControllerAPITest {
String token = "xxx";
@InjectMocks
private ControllerAPI controllerAPI;
@Mock
private CompaniaService companiaService;
private MockMvc mockMvc;
@BeforeEach
public void setup() throws Exception{
this.mockMvc = MockMvcBuilders.standaloneSetup(controllerAPI).build();
}
@Test
void getByField() throws Exception { ... }
使用@WebMvcTest
@WebMvcTest(ControllerAPI.class)
class ControllerAPITest {
String token = "xxx";
@MockBean
private CompaniaService companiaService;
@Autowired
private MockMvc mockMvc;
@Test
void getByField() throws Exception { ... }
我不知道为什么,但是当我尝试使用 MVC 从控制器测试我的任何方法时,我的代码给了我一个 nullPointerException 错误。这里我放了部分代码:
我的控制器(仅限第一种方法):
@RestController
@RequestMapping(path = "/companias")
public class ControllerAPI {
@Autowired
private final CompaniaServiceImpl companiaService;
public ControllerAPI(CompaniaServiceImpl companiaService) {
this.companiaService = companiaService;
}
@ResponseStatus(HttpStatus.OK)
@GetMapping("/{companiaId}/{field_name}")
public Map<String, List<Object>> getByField(
@PathVariable("companiaId") Long companiaId,
@PathVariable("field_name") String fieldName) {
return companiaService.getCompaniaByfield(companiaId, fieldName);
}
这是我的服务(我想模拟的那个):
@Service
@Slf4j
public class CompaniaServiceImpl implements CompaniaService {
private final CompaniaRepository companiaRepository;
private final DefaultGroupRepository defaultGroupRepository;
private final OfficeRepository officeRepository;
@Autowired
public CompaniaServiceImpl(CompaniaRepository companiaRepository, DefaultGroupRepository defaultGroupRepository, OfficeRepository officeRepository) {
this.companiaRepository = companiaRepository;
this.defaultGroupRepository = defaultGroupRepository;
this.officeRepository = officeRepository;
}
public Map<String, List<Object>> getCompaniaByfield(Long companiaId, String fieldName) {
if (companiaRepository.existsById(companiaId)) {
Map<String, Function<Compania, Object>> mapCompania = Map.of(
"name", Compania::getName,
"dominio", Compania::getDominio,
"altas", Compania::getAltas,
"bajas", Compania::getBajas
);
Compania c = companiaRepository.findCompaniaById(companiaId);
Function<Compania, Object> retriever = mapCompania.get(fieldName);
return Collections.singletonMap("success", List.of(retriever.apply(c)));
}
else throw new IllegalStateException(
"Compania con id (" + companiaId + ") no existe"
);
}
这是我的控制器测试:
@ExtendWith(SpringExtension.class)
@ContextConfiguration
class ControllerAPITest {
String token = "xxx";
@InjectMocks
private ControllerAPI controllerAPI;
private CompaniaServiceImpl companiaService = Mockito.mock(CompaniaServiceImpl.class);
private MockMvc mockMvc;
@Before
public void setup() throws Exception{
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controllerAPI).build();
}
@Test
void getByField() throws Exception {
Map<String, List<Object>> response = Collections.singletonMap("success", List.of("nombre1"));
Mockito.when(companiaService.getCompaniaByfield(1L,"name")).thenReturn(response);
this.mockMvc.perform(
get("/companias/{companiaId}/{field_name}", 1L, "name")
.header("authorization", "Bearer " + token)
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.success[0]").isNotEmpty())
.andExpect(jsonPath("$.success[0]").value("nombre1"));
}
以及给我的 NullPointerException 错误:
java.lang.NullPointerException
at database.configuration.controller.ControllerAPITest.getByField(ControllerAPITest.java:69)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod[=14=](ExecutableInvoker.java:115)
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke[=14=](ExecutableInvoker.java:105)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod(TestMethodTestDescriptor.java:212)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
它在 this.mockMvc.perform( 行中给了我这个错误,我不知道为什么无法模拟我的服务。如果你能帮助我,我将不胜感激
测试中的主要问题是您在单个测试中混合了 JUnit 4 注释和 JUnit5。 @Before
来自 JUnit4,因此设置永远不会是 运行,因此不会创建依赖项或模拟。因此 NullPointerException
因为没有注入任何东西。
在您的代码中,您应该使用 CompaniaService
接口而不是 CompaniaServiceImpl
。您已经定义了一个接口,您应该使用它来发挥您的优势。
更换控制器。
@RestController
@RequestMapping(path = "/companias")
public class ControllerAPI {
private final CompaniaService companiaService;
public ControllerAPI(CompaniaService companiaService) {
this.companiaService = companiaService;
}
你不需要 @Autowired
字段,因为注入是通过构造函数完成的!
现在,对于测试,您可以做几件事。
将
@Before
替换为@BeforeEach
,这是标记方法的JUnit5注解。您不需要@ExtendsWith
和@ContextConfiguration
.而不是
@ExtendsWith(SpringExtension.class)
使用MockitoExtension
,使用@BeforeEach
但不初始化模拟。使用
@WebMvcTest
和@MockBean
并让 Spring Boot 为您处理注入和模拟创建。
使用正确的注释
class ControllerAPITest {
String token = "xxx";
@InjectMocks
private ControllerAPI controllerAPI;
@Mock
private CompaniaService companiaService;
private MockMvc mockMvc;
@BeforeEach
public void setup() throws Exception{
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controllerAPI).build();
}
@Test
void getByField() throws Exception { ... }
使用MockitoExtension
@ExtendsWith(MockitoExtension.class)
class ControllerAPITest {
String token = "xxx";
@InjectMocks
private ControllerAPI controllerAPI;
@Mock
private CompaniaService companiaService;
private MockMvc mockMvc;
@BeforeEach
public void setup() throws Exception{
this.mockMvc = MockMvcBuilders.standaloneSetup(controllerAPI).build();
}
@Test
void getByField() throws Exception { ... }
使用@WebMvcTest
@WebMvcTest(ControllerAPI.class)
class ControllerAPITest {
String token = "xxx";
@MockBean
private CompaniaService companiaService;
@Autowired
private MockMvc mockMvc;
@Test
void getByField() throws Exception { ... }