包含 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
(不可能,至少很容易)而不是 ClassLoader
和 URI
.
但是这样做是没有意义的。真正的问题是:为什么要嘲笑它?这应该在您的测试环境中有一个已知且明确的答案。只需在您的测试中使用它即可。
如果出于某种奇怪的原因,你真的想改变这个答案,你应该重构你的代码和一些方法,比如
protected File getFileToMe() {
return new File(getClass().getResource("/filename").getPath());
}
然后您可以使用匿名内部 class 或部分模拟来测试是否覆盖该方法。
我可以通过创建一个测试文件 filename
并将其放在 src/test/resource
文件夹中来解决上述问题,当我 运行 测试通过时。
我的代码中有以下服务 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
(不可能,至少很容易)而不是 ClassLoader
和 URI
.
但是这样做是没有意义的。真正的问题是:为什么要嘲笑它?这应该在您的测试环境中有一个已知且明确的答案。只需在您的测试中使用它即可。
如果出于某种奇怪的原因,你真的想改变这个答案,你应该重构你的代码和一些方法,比如
protected File getFileToMe() {
return new File(getClass().getResource("/filename").getPath());
}
然后您可以使用匿名内部 class 或部分模拟来测试是否覆盖该方法。
我可以通过创建一个测试文件 filename
并将其放在 src/test/resource
文件夹中来解决上述问题,当我 运行 测试通过时。