包含 getClassLoader().getResource() 的方法的 Junit

Junit for a method containing getClassLoader().getResource()

我的代码中有以下服务 class。

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

我正在尝试为 getGroups() 方法编写一个 Junit,但在我创建新文件的那一行卡住了。我尝试使用 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.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[=12=]0(ParentRunner.java:41)
at org.junit.runners.ParentRunner.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)

编辑

添加测试class。

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

感谢任何帮助。谢谢。

你是不是在调用mocked方法之前以你的mock为参数调用EasyMocks的replay方法?如果不是,那可能就是您收到空指针异常的原因。

添加测试后 class,我发现了问题。

试试这个:

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 Guide

mock 在哪里?请阅读 EasyMock 文档,因为您还不了解 mock 的工作原理。

您想要 MyServiceImpl.class.getClassLoader().getResource("filename").getPath() 到 return 一个特定值。这实际上是不可能做到的。这意味着模拟 MyServiceImpl.class(不可能,至少很容易)而不是 ClassLoaderURI.

但是这样做是没有意义的。真正的问题是:为什么要嘲笑它?这应该在您的测试环境中有一个已知且明确的答案。只需在您的测试中使用它即可。

如果出于某种奇怪的原因,你真的想改变这个答案,你应该重构你的代码和一些方法,比如

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

然后您可以使用匿名内部 class 或部分模拟来测试是否覆盖该方法。

我可以通过创建一个测试文件 filename 并将其放在 src/test/resource 文件夹中来解决上述问题,当我 运行 测试通过时。