2016-09-15 75 views
1

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

MUT

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

@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(); 
} 

堆栈跟踪

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) 

感谢,提前

回答

1

看来你忘了在您的测试中添加一行:

accountAction.setVendorManager(iManager); 
+0

对不起,但没有安装人员的IManager。 – Jaykumar

+0

@Jaykumar:本着解决方案的精神,这是正确的。不知何故,您需要提供'getVendorManager'将提供的值,否则它将愉快地返回'null'。 – Makoto

+0

我得到的vendorManager和调试时经历getVendorManager,但由于某种原因,它不进入getAllVendors() – Jaykumar

0

你的问题基本上是你写的代码很难测试。 首先,要了解如何提高您在该地区的技能,请启动here并花一些时间观看视频。没有大片,但仍值得你花时间。

你会在那里学习的关键点:你必须小心你的代码使用的对象来自何处。含义:也许你的代码不应该调用getVendorManager()...但是用注入这个类的对象呢?因为那样你可以很容易地嘲笑。

+0

我会遵循指导原则,但我现在应该做什么。我无法停止测试,也无法更改代码。 – Jaykumar

+0

我想你会得到其他答案背后的人给你一个工作解决方案;-) – GhostCat

+0

正确,你不是那个幸运的人:) – Jaykumar