当前位置: 首页 > 知识库问答 >
问题:

Mockito-模拟自动装配服务

李星辰
2023-03-14

我有一个 Rest Controller 类,其中我正在自动布线服务层。现在我想模拟测试类中的服务层,但在运行我的测试类“想要但未调用”时遇到以下异常:dbCacheService.refreshCache();

控制器代码

public class AppController {
    @Autowired
    private DbCacheService dbCacheService;

    @GetMapping("/refresh")
    @ApiOperation(value = "Refresh the database related cache", response = String.class)
    public String refreshCache() {
        dbCacheService.refreshCache();
        return "DB Cache Refresh completed";
    }
}

测试类

@ExtendWith(MockitoExtension.class)
class SmsControllerTest {

    @Mock
    private DbCacheService dbCacheService;

    @BeforeMethod
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void refreshCache() {
        Mockito.verify(dbCacheService, Mockito.times(1)).refreshCache();
    }
}

我是JUnit5和Mockito的新手。有人能告诉我哪里错了吗?

共有1个答案

高钱青
2023-03-14

您实际上并没有在测试中调用Controller方法,这就是为什么它抱怨调用dbCacheService.refreshCache()从未发生的原因。尝试以下操作:

@ExtendWith(MockitoExtension.class)
class SmsControllerTest {

    @Mock
    private DbCacheService dbCacheService;

    @InjectMocks
    private AppController appController;

    @BeforeMethod
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void refreshCache() {
        appController.refreshCache();
        Mockito.verify(dbCacheService, Mockito.times(1)).refreshCache();
    }
}

尽管这可能有效,但这不是测试控制器的正确方法。您应该通过实际发出HTTP请求而不是方法调用来测试它们。为了做到这一点,您需要使用@WebMvcTest进行切片测试:

  • https://www.baeldung.com/spring-boot-testing#unit-testing-with-webmvctest
  • https://rieckpil.de/spring-boot-test-slices-overview-and-usage/

大致是:

@RunWith(SpringRunner.class)
@WebMvcTest(AppController.class)
public class AppControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private DbCacheService dbCacheService;

    @Test
    public void refreshCache() {
        mvc.perform(get("/refresh")
          .contentType(MediaType.APPLICATION_JSON))
          .andExpect(status().isOk())

        Mockito.verify(dbCacheService, Mockito.times(1)).refreshCache();
    }
}
 类似资料:
  • 问题内容: 我正在使用Spring 3.1.4.RELEASE和Mockito 1.9.5。在我的Spring班上,我有: 从我目前设置的JUnit测试中可以看到: 我想为“ defaultUrl”字段模拟一个值。请注意,我不想模拟其他字段的值-我想保留它们的值,只保留“ defaultUrl”字段。另外请注意,我的班级中没有明确的“ setter”方法(例如),并且我不想仅为测试目的而创建任何方

  • 问题内容: 我有一个要测试的Spring组件,该组件具有autowired属性,出于单元测试的目的,我需要更改该属性。问题是,该类在post- construct方法内部使用了自动装配的组件,因此在实际使用它之前,我无法替换它(即通过ReflectionTestUtils)。 我该怎么办? 这是我要测试的课程: 这是一个测试用例的基础: 在调用postconstruct方法之前,是否可以用其他方法

  • 主要内容:Spring 自动装配,自动装配规则,示例我们把 Spring 在 Bean 与 Bean 之间建立依赖关系的行为称为“装配”。 Spring 的 IOC 容器虽然功能强大,但它本身不过只是一个空壳而已,它自己并不能独自完成装配工作。需要我们主动将 Bean 放进去,并告诉它 Bean 和 Bean 之间的依赖关系,它才能按照我们的要求完成装配工作。 在前面的学习中,我们都是在 XML 配置中通过 <constructor-arg>和 <

  • 问题内容: 我对模拟还很陌生,并且我一直在尝试模拟实际内容(本质上仅在内存中创建一个虚拟文件),以便在任何时候都不会将任何数据写入磁盘。 我尝试过模拟文件和模拟尽可能多的属性的解决方案,然后还使用文件写入器/缓冲写入器将其写入,但是这些方法不能很好地工作,因为它们需要规范路径。有人找到了除此以外的解决方案,但我正在解决这个错误? 我一直在这样做: 任何想法或指导都将非常有帮助。在此之后的某个地方,

  • 我有一个服务类需要进行单元测试。该服务有一个上载方法,该方法反过来调用其他更新数据库的服务(自动连线bean)。我需要模拟其中一些服务,还有一些服务需要按原样执行。 在上面的例子中,我需要模拟ServiceA,但是我希望ServiceB按原样运行并执行它的功能。我的JUnit测试如下所示: 当我执行这个,我得到NPE在在. 有什么问题吗? 注意:我没有指定被模拟对象的行为,因为我真的不在乎,而且被

  • 问题内容: 我有以下代码: 我想使用Mockito创建一个测试。我编写了如下测试: 我在网上收到NullPointerException: ,它表示“策略”列表已初始化,但为空。Mohito有什么办法可以像Spring一样浪费时间?是否将所有实现接口“策略”的实例自动添加到列表中? 顺便说一句,我在Wrapper类中没有任何二传手,如果可能的话,我想以这种方式离开。 问题答案: Mockito不知