2013-09-04 3 views
1

Когда я запускаю этот тест, я получаю ExceptionInitializerError. Я думаю, что ошибка лежит в строке, которую я обозначил с помощью «Ошибка». Может быть, мне нужно что-то сделать, чтобы позаботиться об этом заявлении в своем тесте, но я просто не могу понять, что. Любая помощь будет высоко ценится.Mockito ExceptionInInitializerError, вызванный NPE

Я использую mockito для проверки этого. Я не имею права менять класс DAOFactory. Поэтому любые изменения должны быть в MyClass.java или в тестовом классе.

Как вы можете видеть, мой метод тестирования пуст.

испытаний Класс:

@RunWith(MockitoJUnitRunner.class) 
public class MyClassTest { 
    @InjectMocks MyClass myClass = new MyClass(); 

    @Mock DAOFactory daoFactory; 
    @Mock MyDao dao; 

    @Test 
    public void myMethodTest(){ 

    } 
} 

Класс для тестирования:

public class MyClass{ 
    private MyDao dao = DAOFactory.getInstance().getMyDao();  
    public void myMethod(){ 
    } 
} 

public class DAOFactory { 
    private static DAOFactory instance = new DAOFactory(); 
    private DAOFactory() {} 

    public static DAOFactory getInstance() { 
     return instance; 
    } 

    final private CustDao custDao= new CustDao();//-------Error----------- 
    final private MyDao dao = new MyDao();//-------Error----------- 

    public MyDao getMyDao(){ 
     return dao; 
    } 
} 

Failute следа:

java.lang.ExceptionInInitializerError 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:222) 
    at com.mycomp.nom.service.impl.MyClass.<init>(MyClass.java:15) 
    at com.mycomp.nom.service.impl.IHardCloseoutTimeServiceImplTest.<init>(IHardCloseoutTimeServiceImplTest.java:15) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:44) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:516) 
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:195) 
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.NullPointerException 
    at com.mycomp.core.persistence.hibernate.AbstractDAO.<init>(AbstractDAO.java:71) 
    at com.mycomp.bbm.core.persistence.hibernate.AbstractDAO.<init>(AbstractDAO.java:58) 
    at com.mycomp.nom.dao.hibernate.AbstractTDAO.<init>(AbstractTDAO.java:52) 
    at com.mycomp.nom.dao.hibernate.HibernateAggregateMailClassDAO.<init>(HibernateAggregateMailClassDAO.java:38) 
    at com.mycomp.nom.dao.DAOFactory.<init>(DAOFactory.java:51) 
    at com.mycomp.nom.dao.DAOFactory.<clinit>(DAOFactory.java:42) 
    at java.lang.J9VMInternals.initializeImpl(Native Method) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:200) 
    ... 26 more 
+0

Я думаю, у вас есть опечатка, 'final private CustDao = new CustDao();' не будет компилироваться. Вам нужно имя переменной. – Aurand

+3

, и вы должны посмотреть, что вызывает NPE в AbstractDAO.java:71. – roehrijn

+0

@Aurand Я исправил свою ошибку. Это была опечатка. – Susie

ответ

1

Я е вы хотите проверить этот класс в изоляции, вы должны удалить автоматическое создание экземпляра зависимости Dao здесь:

public class MyClass{ 
    private MyDao dao = DAOFactory.getInstance().getMyDao();  
    public void myMethod(){ 
    } 
} 

Вы можете реорганизовать MyCLASS код с конструкторами, один для производства одного для целей тестирования:

public class MyClass{ 
    private MyDao dao; 

    public MyClass() { 
     dao = DAOFactory.getInstance().getMyDao(); 
    } 

    @VisibleForTesting 
    MyClass(Dao dao) { // package visible for the test only 
     this.dao = dao; 
    } 

    public void myMethod() { } 
} 

Там вы можете избежать проблемного создания реального DAO в своем тесте. Именно поэтому у вас был ExceptionInInitializerError.

+0

Спасибо за ответ, но может быть, не стоит включать библиотеку guava, чтобы я мог протестировать. Хотя я попробую гуаву только ради знания. – Susie

+0

* guava * не требуется, это просто аннотация для целей документации, вы можете создать свою собственную аннотацию, если хотите, просто используйте комментарий одного лайнера или вообще ничего (что не будет действительно значимым) – Brice