2016-09-15 3 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

Смежные вопросы