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

Spring单元测试:使用@SpyBean模拟void方法:获取该bean的NullPointerException,除非我使用@mock

宋典
2023-03-14

我试图使@spybean或@mockbean在这个测试中工作,就像它们在我的所有其他测试中一样。这里唯一的区别是这个测试使用了一个活动的概要文件,因为它模拟了一些AWS库

@Component
public class SqsAdapter {

    @Autowired
    QueueMessagingTemplate queueMessagingTemplate;

    @Autowired
    MyProcessor processor;

    @SqsListener("${queue.name}")
    public void onEvent(String message) {
        if (!StringUtils.isEmpty(message)) {
            processor.process(message);
        } else { 
            log.error("Empty or null message received from queue");
        }
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@ActiveProfiles("local")
public class SqsAdapterTest {

    @Autowired
    AmazonSQSAsync amazonSQS;

    @SpyBean
    MyProcessor processor;

    @InjectMocks
    SqsAdapter adapter;

    @Test
    public void testOnEvent() {
        doNothing().when(processor).process(any()); // <---- process() is void
        String event = "royale with cheese";
        adapter.onEvent(event);
        verify(processor, times(1)).process(event);
    }
}

当我在单元测试中调试时,我在processor上得到一个java.lang.NullPointerException,就好像它从未被初始化一样:

我也尝试将其切换到@mockbean,结果相同

此外,我还尝试取消对@springboottest和@activeprofiles的测试...并删除了AmazonSQSAsync依赖项,因为我不是在嘲笑监听器本身,它仍然抛出相同的NPE

我错过了什么?

共有1个答案

柴增
2023-03-14

我想我已经得到了答案:似乎是因为通过将@injectMocks注释与@spybean混合使用测试框架...因为我试图不使用Mockito mocks,而这是一个Mockito注释,我认为这是在搞砸测试

工作单元测试如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("local")
public class SqsAdapterTest {

    @Autowired
    AmazonSQSAsync amazonSQS;

    @SpyBean
    SeamEventProcessor seamEventProcessor;

    @Autowired
    SqsAdapter adapter;

    @Test
    public void testOnEvent() {
        doNothing().when(seamEventProcessor).process(any());
        String event = "royale with cheese";
        adapter.onEvent(event);
        verify(seamEventProcessor, times(1)).process(event);
    }
}
 类似资料:
  • 我试图模拟一个方法链(嵌套)以返回所需的值,这是代码: 我试过这个模拟,但它不起作用: 任何解决方案如何解决这样的问题? 非常感谢。

  • 我的实现出了什么问题?谢谢

  • 我正在进行一个spring-boot项目,其中我有一个控制器,它调用服务方法并处理输出。 我正在使用spring MockMvc测试web层。在我的测试类中,我用Mockito.when()模拟了服务方法。但是当我调用相应的处理方法时,它不是调用被模仿的服务方法,而是返回一个空响应。 控制器 测试类 返回的响应是 请帮我解决这个问题。提前谢谢!

  • 我正在为以下类编写单元测试 要测试的类: 注意:我正在使用TestNG和mockito。我可以扩展并使用,声明我的bean和自动应用上下文。我觉得这对我的用例来说是矫枉过正。我只需要模拟ApplicationContext的getBean方法。

  • 问题内容: 如何用void返回类型模拟方法? 我实现了一个观察者模式,但是我无法用Mockito对其进行模拟,因为我不知道如何做。 我试图在互联网上找到一个例子,但没有成功。 我的课看起来像这样: 系统不会通过模拟触发。 我想显示上述系统状态。并根据他们做出断言。 问题答案: 看看Mockito API文档。由于链接的文档提到(点#12),你可以使用任何的家人从框架的的方法来嘲笑无效的方法。 例如

  • 我在单元测试中使用了Moq框架。这是UpdateApplication测试方法: 我在运行测试时遇到一个异常: 我应该如何编写使用Moq更新和删除操作的单元测试?