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

mockito:与此mock零交互

史智志
2023-03-14

我有一门课要考。

@Configuration
@Import(EmailageConfiguration.class)
public class EmailageServiceConfiguration {

    private static final String EMAILAGE_ACCOUNT_ID_CONFIG_KEY = "emailage.key";
    private static final String EMAILAGE_API_KEY_CONFIG_KEY = "emailage.secret";

    @Bean
    public EmailageConfigHolder emailageConfigHolder(Environment env) {

        final EmailageConfigHolder holder = new EmailageConfigHolder();

        holder.setApiKey(env.getRequiredProperty(EMAILAGE_API_KEY_CONFIG_KEY));
        holder.setAccountId(env.getRequiredProperty(EMAILAGE_ACCOUNT_ID_CONFIG_KEY));

        return holder;
    }

}

提供了我的测试类,

@RunWith(MockitoJUnitRunner.class)
public class EmailageServiceConfigurationTest {

    @InjectMocks
    private EmailageServiceConfiguration configuration;

    @Mock
    private Environment environment;

    @Mock
    private EmailageConfigHolder holder;

    @Test
    public void testEmailageConfigHolder() {

        when(environment.getRequiredProperty(anyString())).thenReturn(anyString());

        configuration.emailageConfigHolder(environment);

        verify(holder, times(1)).setApiKey(anyString());
        verify(holder, times(1)).setAccountId(anyString());
    }
}

我得到了下面提供的错误堆栈,

需要但未调用:Holder.SetapIkey();->在com.ratepay.ella.service.config.EmailageServiceConfigurationTest.TestEmailageConfigholder(EmailageServiceConfigurationTest.java:48)实际上,与这个模拟没有任何交互。需要但未调用:Holder.SetapIkey();->在com.ratepay.ella.service.config.EmailageServiceConfigurationTest.TestEmailageConfigholder(EmailageServiceConfigurationTest.java:48)实际上,与这个模拟没有任何交互。在com.ratepay.ella.service.config.emailageServiceConfigurationTest.TesteMailageConfigholder(emailageServiceConfigurationTest.Java:48)在sun.reflect.nativeMethodAccessorInvoke0(原生方法)在sun.reflect.nativeMethodAccessorInvoke.Invoke(NativeMethodAccessorInvoke:62)在在org.junit.runners.ParentRunner$3。Run(ParentRunner.Java:290)在org.junit.runners.ParentRunner$1。Schedule(ParentRunner.Java:71)在org.junit.runners.ParentRunner.Runchildre(ParentRunner.Java:288)在org.junit.runners.ParentRunner.Access$000(ParentRunner.Java:58)在org.junit.runners.ParentRunner.Access$2。evaluate(junit.junitstarter.PrepareStreamsandStart(junitstarter.java:242)在com.intellij.rt.execution.junit.junitstarter.main(junitstarter.java:70)

我如何修正测试?

共有2个答案

皇甫琛
2023-03-14

而另一个答案更符合情况,我无法更新代码,最后,编写了这个测试代码。

@RunWith( MockitoJUnitRunner.class )
public class EmailageServiceConfigurationTest {

    private static final String ACCOUNT_ID = "emailage.key";
    private static final String API_KEY = "emailage.secret";

    @InjectMocks
    private EmailageServiceConfiguration configuration;

    @Mock
    private Environment environment;

    @Test
    public void testEmailageConfigHolder() {

        configuration.emailageConfigHolder( environment );

        verify( environment, times( 1 ) ).getRequiredProperty( API_KEY );
        verify( environment, times( 1 ) ).getRequiredProperty( ACCOUNT_ID );
    }
}
通俊发
2023-03-14

这里:

final EmailageConfigHolder holder = new EmailageConfigHolder();

Mockito不能将模拟注入到局部变量中。文档对此非常清楚:

Mockito将尝试按照如下所述,仅通过构造函数注入、设置器注入或属性注入来注入模拟。

基本上,通过在方法主体中使用new(),您编写了难以测试的代码。因为使用Mockito,您没有任何选项来控制new()将在该方法主体中返回什么。

解决办法:

  • 使“holder”成为类字段,然后通过该注释或通过接受holder实例的构造函数注入
  • 将实例作为参数传递给方法

或者假设您可以在单元测试设置中的生产代码中实际创建一个新的Holder对象,并且在返回该对象时,只需对返回对象的属性进行断言。从这个角度来看,你根本不需要在这里使用嘲讽。只需验证从该调用返回的对象是否具有预期的属性!

或者,(不推荐)您可以使用PowerMock(ito)或JMockit,以获得对new()调用的控制权。但是如前所述:最好重新编写您的代码以便于测试。

顺便说一句:真正的答案是你退后一步,读一本关于Mockito的好教程。你无法通过反复试验来学习如何使用这样的框架。学习如何用很好的小例子正确地完成它,然后,当你理解了如何连接点,然后将它应用到你自己的代码中!

 类似资料:
  • 我有接口 接口的实现是 我还有一节课 我正在尝试为MyClass编写JUnit。我已经做了 但我需要mockito但没有调用,实际上在验证调用时与这个mock没有任何交互。 谁能提出一些解决方案。

  • 我有一个Springboot应用程序,它在运行时根据用户传递的输入参数从中查找bean。对于这种方法,我试图编写Mockito测试用例,但它不起作用,并抛出NullPointerException。 引导应用程序的类: 我试图为其编写测试用例的类: 我的测试用例如下: 每当我运行测试用例时,它都会在

  • In certain cases, unit tests may depend on classes that fetch data from live web services or databases. This is inconvenient for a few reasons: Calling live services or databases slows down test execu

  • 如果null对象的string属性与预先确定的值不匹配,我有一个测试来验证该对象的返回。我的代码是

  • 在执行以下步骤后,我得到了错误:想要但没有调用:实际上,与这个模拟没有任何交互。我不明白我在这里遗漏了什么。

  • 我试图为我的JSF应用程序和我正在使用的mockito实现一些测试。(我也使用spring) 测试成功,但是当我想用方法检索实例时。我之前设置的所有参数(通过之前的构造函数)都是空的。我对模拟对象不熟悉,所以这种行为正常吗,或者我的代码中有错误吗?