我有一门课要考。
@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)
我如何修正测试?
而另一个答案更符合情况,我无法更新代码,最后,编写了这个测试代码。
@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 );
}
}
这里:
final EmailageConfigHolder holder = new EmailageConfigHolder();
Mockito不能将模拟注入到局部变量中。文档对此非常清楚:
Mockito将尝试按照如下所述,仅通过构造函数注入、设置器注入或属性注入来注入模拟。
基本上,通过在方法主体中使用new()
,您编写了难以测试的代码。因为使用Mockito,您没有任何选项来控制new()
将在该方法主体中返回什么。
解决办法:
或者假设您可以在单元测试设置中的生产代码中实际创建一个新的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) 测试成功,但是当我想用方法检索实例时。我之前设置的所有参数(通过之前的构造函数)都是空的。我对模拟对象不熟悉,所以这种行为正常吗,或者我的代码中有错误吗?