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

春靴

南宫阳焱
2023-03-14

我想在我的Junit5单元测试中将值注入到带有@Value注释的私有字段。

@Value("$(invoice.maxRetry)")
private maxRetry;

我引用了这个,并使用了ReflectionTestUtils。setField通过注入值解决了我的问题,但在验证方法被调用的次数时失败。

MyClass(我的类别):

    public class MessageProcessor {
         
    @Value("$(invoice.maxRetry)")
        private maxRetry;
    
    protected void handleMessage() {
            if(retry > maxRetry) {
                kafkaTemplate.sendMessage(msg);
       }
}

测试类:

@ExtendWith(MockitoExtension.class)
public class MessageProcessorTest {

@Mock
private kafkaTemplate kafkaTemplate;

@Mock
private MessageProcessor messageProcessor

@Test
test() {
     ReflectionTestUtils.setField(messageProcessor, "maxRetry", "5");
     doNothing().when(kafkaTemplate).sendMessage(any());
     messageProcessor.handleMessage();
     verify(kafkaTemplate).sendMessage(any());
  }
}

运行上述测试时出错

org.mockito.exceptions.verification.TooManyActualInvocations: 
kafkaTemplate.sendMessage(<any>);
Wanted 1 time:
But was 2

我想kafkaTemplate.sendMessage();被调用一次,但被调用两次后添加反射TestUtils。

需要关于如何修复此问题的建议。

共有1个答案

西门安宁
2023-03-14

通过稍微重构类并支持构造注入,可以避免使用ReflectionTestUtils:

public class MessageProcessor {
     
    private String maxRetry;
    private KafkaTemplate template;

    // ... any further fields

    public class MessageProcessor(@Value("$(invoice.maxRetry)") String maxRetry, KafkaTemplate kafkaTemplate) {
       this.maxRetry = maxRetry;
       this.kafkaTemplate = kafkaTemplate;
    }

 }

然后,在测试中,您可以通过手动创建被测试类的实例(MessageProcessor)来控制maxRetry的值。

@ExtendWith(MockitoExtension.class)
public MessageProcessorTest {

  @Mock 
  private KafkaTemplate kafkaTemplate;

  private MessageProcessor messageProcessor;

  @BeforeEach
  void setUp() {
    this.messageProcessor = new MessageProcessor("42", kafkaTemplate);

  }

}

... 然后只依赖JUnit和Mocktio,这将帮助您添加验证。

 类似资料:
  • 我想把硒和Spring一起使用。 如果我在没有Spring的情况下使用Selenium,一切正常。每当我添加Spring依赖项(没有Spring代码)时,执行时会引发以下异常: 线程“main”java中出现异常。lang.NoClassDefFoundError:org/openqa/selenium/MutableCapabilities at java。lang.ClassLoader。在j

  • 我想在我的spring boot项目中使用Kafka Streams实时处理。所以我需要Kafka Streams配置,或者我想使用KStreams或KTable,但我在互联网上找不到示例。 我做了制作人和消费者现在我想流实时。

  • 如spring boot博客所述 我尝试自定义我的对象序列化。 在我的配置中添加了一个新的配置bean之后 当我尝试输出类用户的实例时,json结果不在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES中 也许我需要在我的Jersey配置中注册一些东西来激活我的自定义obejctMapper配置 谢谢

  • 我有一个Spring Boot2.25.1应用程序,它使用Camel 2.25.1与camel-kafka,一切都正常工作…在我的Kafka消费者中,我需要添加该功能以按需暂停消费,因此我升级到camel 3.18.1,以便我可以使用可暂停功能。升级到3.18.1后,我收到错误FileNotes与类文件TimeoutAwareAggregationStategy.class. 当我打开camel-

  • 我使用Spring的引导2.6.3和我试图使用thymeleaf最近得到一个与html的确认消息后,我通过邮件确认我的帐户(我只是使用确认邮件来验证新帐户),所以我看了一些关于thymeleaf的视频,我标记所有的视频都有一个名为模板的文件夹和静态在src/main/ressource和我没有他们,所以我创建了一个名为模板的文件夹,在文件夹中我创建了一个html文件只是为了尝试它,如果它(html

  • 我目前正在与apache ivy的conf设置作斗争。也许我会先解释我想实现的目标: 我需要两种配置:编译、运行时 这是我试过的: 但它甚至无法被解析:无法解析ivy文件'...\ivy.xml': 有人能告诉我如何正确地声明conf设置,这样我就可以使用compile或runtime来解析,并获得所有jar,包括可传递的依赖项(在这个示例中,只有ivy的jar)。 使现代化 好的,谢谢你的链接。