Junit для метода, содержащего getClassLoader (). GetResource () - PullRequest
0 голосов
/ 08 ноября 2018

В моем коде есть следующий класс обслуживания.

public class MyServiceImpl {

public List<Group> getGroups() throws JAXBException {
List<Group> viewModel = new ArrayList<Group>();
File file = new File(MyServiceImpl.class.getClassLoader().getResource("filename").getPath());
.....
....
 }
}

Я пытаюсь написать метод Junit для getGroups() и застрял на строке, где я создаю новый файл. Я пробовал с EasyMock и Mockito, но не смог заставить его работать.

EasyMock.expect(MyServiceImpl.class.getClassLoader().getResource("filename").getPath()).andReturn("path");

При выполнении теста я получаю следующее.

java.lang.NullPointerException
at com.mysite.services.content.MyServiceImplTest.testGetGroups(MyServiceImplTest.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
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)

редактировать

Добавление тестового класса.

public class MyServiceImplTest {

private MyServiceImpl service;

@Before
public void setup() {
    service = new MyServiceImpl();
}

@Test
public void testGetGroups() throws Exception {
    EasyMock.expect(MyServiceImpl.class.getClassLoader().getResource("filename").getPath()).andReturn("path");

    service.getGroups();
}

Любая помощь приветствуется. Благодаря.

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

Мне удалось решить вышеуказанную проблему, создав тестовый файл filename и поместив его в папку src/test/resource, и когда я запустил тест, он прошел.

0 голосов
/ 08 ноября 2018

После добавления вашего тестового класса я вижу проблему.

попробуйте это:

public class MyServiceImplTest {
    private MyServiceImpl service;

    @Before
     public void setup() {
          service = EasyMock.createMock(MyServiceImpl.class);
     }

     @Test
      public void testGetGroups() throws Exception {

      EasyMock.expect(MyServiceImpl.getClass.getClassLoader()
      .getResource("filename")
      .getPath())
      .andReturn("path");

       EasyMock.replay(service);
       //Do something with Mock
       EasyMock.verify(service);

 }

Если вы хотите вызвать service.getGroups (), вам нужно либо смоделировать вызов этого метода, либо использовать частичный макет. Смотрите здесь и ищите частичное издевательство: Руководство EasyMock

0 голосов
/ 25 ноября 2018

Где здесь макет? Пожалуйста, прочитайте документацию EasyMock, потому что вы не поняли, как работает макет.

Вы хотите, чтобы MyServiceImpl.class.getClassLoader().getResource("filename").getPath() вернул определенное значение. Это на самом деле невозможно сделать. Это означало бы высмеивать MyServiceImpl.class (невозможно, по крайней мере, легко), чем ClassLoader и URI.

Но делать это бессмысленно. И настоящий вопрос: зачем издеваться над этим? Это должно иметь известный и окончательный ответ в вашей тестовой среде. Просто используйте это в своем тесте.

Если по какой-то странной причине вы действительно хотите изменить этот ответ, вам следует провести рефакторинг своего кода и некоторого метода, такого как

protected File getFileToMe() {
    return new File(getClass().getResource("/filename").getPath());
}

Затем вы можете проверить переопределение метода, используя анонимный внутренний класс или частичную имитацию.

0 голосов
/ 08 ноября 2018

Вы вызываете метод воспроизведения EasyMocks с вашим макетом в качестве параметра перед вызовом этого метода? Если нет, возможно, именно поэтому вы получаете исключение Null Pointer.

...