【问题标题】:MockBean not injected in MVC Controller testMockBean 未注入 MVC 控制器测试
【发布时间】:2019-11-18 22:14:23
【问题描述】:

我正在尝试独立于 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);
}

这是我的测试课

@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:参数 传递给 when() 为空!正确的存根示例: doThrow(new RuntimeException()).when(mock).someMethod();另外,如果你使用 @Mock 注解,不要错过 initMocks()

就像从未创建服务一样。我该如何解决这个问题?

我们可以通过使用@RunWith(SpringRunner.class) 代替@ExtendWith(SpringExtension.class) 来解决这个问题。有人可以解释为什么它确实有效吗?通常第一个注释是针对 junit4 的,后面是针对 junit5 的。

【问题讨论】:

  • @MockBean 不是 Mockito 注释。改用@Mock
  • 没有任何变化。

标签: java spring-mvc mockito spring-test-mvc


【解决方案1】:

不幸的是,由于依赖问题,问题已经解决了。

我的 pom.xml 文件包含 spring-boot-starter-test,如果我们检查包含这个 starter 的内容,我们会发现它包含 junit4 作为依赖项,而不是 junit5。

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>compile</scope>
</dependency>

当我尝试使用 @ExtendWith(SpringExtension.class) 在我的测试类中使用 Junit5 时,不幸的是,测试编译但给出了运行时错误。 我通过从 spring boot 启动器中排除 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2020-11-03
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多