首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Mockito测试接口方法

使用Mockito测试接口方法
EN

Stack Overflow用户
提问于 2016-09-16 00:50:43
回答 2查看 7.8K关注 0票数 2

我正在为一个方法编写一个JUnit测试用例,该方法通过接口内部调用另一个方法。我使用Mockito来模拟界面,但由于某种原因,它给了我NPE。我调试过了,但没有得到任何线索来修复它。getAllVendors()方法抛出通过接口传入的异常。

静音

代码语言:javascript
复制
public void prepare() throws AccountServiceException, ManagerException {
vendors = getVendorManager().getAllVendors();

microsites = new ArrayList<VendorMicrositeTO>();
microsites.add( new VendorMicrositeTO( "http://www.docusign.com", "docuSign" ) );

clientUser = createClientUserObject();

}

JUnit

代码语言:javascript
复制
@Test
public void testPrepare() throws Exception {
    AccountAction accountAction = new AccountAction();
    Map<String, Object> actionMap = new HashMap<>();
    actionMap.put("application", "ESignatureIntegrationAction");

    ActionContext.setContext(new ActionContext(actionMap));
    String beanName = Constants.VENDOR_MANAGER_SPRING_BEAN;
    PowerMockito.mockStatic(AppContext.class);
    PowerMockito.when(AppContext.containsBean( beanName )).thenReturn( true );

    IVendorDto iVendorDto = new VendorDto();
    iVendorDto.setActive(true);
    iVendorDto.setCreatedBy("9/15/2016");
    iVendorDto.setName("CorpESignClientUser");
    iVendorDto.setCreatedBy("SYSTEM");

    List<IVendorDto> vendorList = new ArrayList<>();
    vendorList.add(iVendorDto);

    IVendorManager iManager = Mockito.mock((IVendorManager.class));
    Mockito.when(iManager.getAllVendors()).thenReturn(vendorList);

    accountAction.setVendors(vendorList);
    accountAction.prepare();
}

堆栈跟踪

代码语言:javascript
复制
java.lang.NullPointerException
at com.mercuryinsurance.esignature.ui.webapp.action.AccountAction.prepare(AccountAction.java:65)
at test.com.mercuryinsurance.esignature.ui.webapp.action.TestAccountAction.testPrepare(TestAccountAction.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:86)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:94)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

谢谢,提前说

EN

回答 2

Stack Overflow用户

发布于 2016-09-16 01:00:21

您似乎忘记在测试中添加一行代码,如下所示:

代码语言:javascript
复制
accountAction.setVendorManager(iManager);
票数 1
EN

Stack Overflow用户

发布于 2019-04-02 22:03:59

所以,是的,我一直在解决一个非常类似的问题。

此用例是在基于IoT的应用程序中应用SOLID principles的逻辑结果。如果您使用接口解耦应用程序的各个层并测试内部层,那么您必然会遇到一个接口,该接口的实现具有更多的接口依赖性。

您可以使用两个组合的测试角度来实现此目标

在每次运行期间,

  1. 使用参数化的JUnit运行器在内部为所有Mockito启动一组单元测试。使用

初始化模拟的依赖项

有关参数化测试的更多信息(这是我最初找到它的地方),请务必访问mockito,我在here.中找到了this post.的手动初始化

所有生成的代码如下所示:

代码语言:javascript
复制
 @RunWith(Parameterized.class)
 public class YourInterfaceTest {

   @Mock
   private ImplementationDependency sneakyBreakyNpeAvoided;

   @InjectMocks
   private YourInterfaceToTest iface;
   
   // constructor is used by the Parameterized runner to provide impelementations
   public YourInterfaceTest (YourInterfaceToTest ifaceToTest) {
       this.iface = ifaceToTest;
   }

   // this method is called always before running tests so a good time to inject anything
   @Before
   public void init() {
      MockitoAnnotations.initMocks(this);
      Mockito.when(sneakyBreakyNpeAvoided.returnTrue()).thenReturn(true);
   }

   @Test(expected = IllegalArgumentException.class)
   public void doSomething_nullParameter_throwsIllegalArgumentException() {
      Assert.fail(); // tests here :)
   }

   @Parameterized.Parameters
   public static Collection<YourInterfaceToTest > provideImplementations() {
      // change to Arrays.asList when multiple implementations are available
      return Collections.singletonList(new YourInterfaceImpl());
   }
}

希望我能很好地理解操作员的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39516436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档