Java 包含getClassLoader()的方法的Junit。getResource()

Java 包含getClassLoader()的方法的Junit。getResource(),java,unit-testing,junit,mockito,easymock,Java,Unit Testing,Junit,Mockito,Easymock,我的代码中有以下服务类 public class MyServiceImpl { public List<Group> getGroups() throws JAXBException { List<Group> viewModel = new ArrayList<Group>(); File file = new File(MyServiceImpl.class.getClassLoader().getResource("filename").getPat

我的代码中有以下服务类

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());
.....
....
 }
}
当测试运行时,我得到以下信息

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

感谢您的帮助。谢谢。

在调用mock方法之前,是否以mock作为参数调用EasyMock的replay方法?如果不是,这可能就是为什么会出现空指针异常

添加测试类后,我看到了问题所在

试试这个:

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文档,因为您还不了解模拟的工作原理

您希望
MyServiceImpl.class.getClassLoader().getResource(“文件名”).getPath()
返回特定值。这实际上是不可能做到的。这意味着模仿
MyServiceImpl.class
(不可能,至少很容易),而不是模仿
ClassLoader
URI

但这样做毫无意义。而真正的问题是:为什么要嘲笑这一点?在您的测试环境中,这应该有一个已知和明确的答案。在你的测试中使用它

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

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

然后,您可以使用匿名内部类或部分模拟覆盖该方法进行测试。

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

在添加replay和verify方法后再次尝试,但没有成功。编辑问题以添加测试类。在EasyMock.expect()行测试失败。创建类的模拟不起作用。在进一步检查和喝咖啡后,我注意到您正在将方法调用链接在一起,这些调用返回其他未被模拟的对象。由于这些对象不是由mock返回的(如果不清楚,请阅读更多关于mock的内容),因此返回的只是null,而不是预期的值。您需要创建一个mock类装入器,并让mock serviceinpl.class返回该mock,以此类推。
protected File getFileToMe() {
    return new File(getClass().getResource("/filename").getPath());
}