MockBean 未注入 MVC 控制器测试
MockBean not injected in MVC Controller test
我正在尝试隔离 spring 应用程序上下文来测试我的控制器。
这是我的控制器
@RestController
public class AddressesController {
@Autowired
service service;
@GetMapping("/addresses/{id}")
public Address getAddress( @PathVariable Integer id ) {
return service.getAddressById(id);
}
}
我的服务界面
public interface service {
Address getAddressById(Integer id);
}
这是我的测试class
@ExtendWith(SpringExtension.class)
@WebMvcTest
public class AddressControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
service myService;
@Test
public void getAddressTest() throws Exception {
Mockito.doReturn(new Address()).when(myService).getAddressById(1);
mockMvc.perform(MockMvcRequestBuilders.get("/addresses/1"))
.andExpect(status().isOk());
}
}
这是我遇到的异常:
org.mockito.exceptions.misusing.NullInsteadOfMockException: Argument
passed to when() is null! Example of correct stubbing:
doThrow(new RuntimeException()).when(mock).someMethod(); Also, if you use @Mock annotation don't miss initMocks()
就像从未创建过服务一样。我该如何解决这个问题?
我们可以用@RunWith(SpringRunner.class)
代替@ExtendWith(SpringExtension.class)
来解决这个问题。有人可以解释为什么它确实有效吗?通常第一个注解用于junit4,后面的注解用于junit5。
不幸的是,由于依赖关系问题,问题已解决。
我的 pom.xml 文件包含 spring-boot-starter-test
,如果我们检查包含此启动器的内容,我们会发现它包含 junit4 作为依赖项而不是 junit5。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
当我尝试在我的测试 类 中使用 Junit5 和 @ExtendWith(SpringExtension.class) 时,不幸的是,测试编译但给出运行时错误。
我通过从 spring boot starter 中排除 junit4 解决了这个问题:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
我的pom.xml也应该包含junit5依赖
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
我正在尝试隔离 spring 应用程序上下文来测试我的控制器。
这是我的控制器
@RestController
public class AddressesController {
@Autowired
service service;
@GetMapping("/addresses/{id}")
public Address getAddress( @PathVariable Integer id ) {
return service.getAddressById(id);
}
}
我的服务界面
public interface service {
Address getAddressById(Integer id);
}
这是我的测试class
@ExtendWith(SpringExtension.class)
@WebMvcTest
public class AddressControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
service myService;
@Test
public void getAddressTest() throws Exception {
Mockito.doReturn(new Address()).when(myService).getAddressById(1);
mockMvc.perform(MockMvcRequestBuilders.get("/addresses/1"))
.andExpect(status().isOk());
}
}
这是我遇到的异常:
org.mockito.exceptions.misusing.NullInsteadOfMockException: Argument passed to when() is null! Example of correct stubbing: doThrow(new RuntimeException()).when(mock).someMethod(); Also, if you use @Mock annotation don't miss initMocks()
就像从未创建过服务一样。我该如何解决这个问题?
我们可以用@RunWith(SpringRunner.class)
代替@ExtendWith(SpringExtension.class)
来解决这个问题。有人可以解释为什么它确实有效吗?通常第一个注解用于junit4,后面的注解用于junit5。
不幸的是,由于依赖关系问题,问题已解决。
我的 pom.xml 文件包含 spring-boot-starter-test
,如果我们检查包含此启动器的内容,我们会发现它包含 junit4 作为依赖项而不是 junit5。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
当我尝试在我的测试 类 中使用 Junit5 和 @ExtendWith(SpringExtension.class) 时,不幸的是,测试编译但给出运行时错误。 我通过从 spring boot starter 中排除 junit4 解决了这个问题:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
我的pom.xml也应该包含junit5依赖
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.2</version>
<scope>test</scope>
</dependency>