我想进行一个JUnit测试,以确保某些类不使用一组特定的方法(来自另一个类)。实施例
class MyClass
{
void myMethod()
{
otherClass.otherClassStaticMethod();
}
}
class myTest
{
void test()
{
assertFalse(CalledMethods.getMethodsCalledBy("myClass.myMethod").Contains("otherClass.otherClassStaticMethod"));
}
}
在这个测试中,我想确保myMethod不会调用otherClassStaticMethod。如何在编译时找到方法内部调用的方法(忽略使用反射调用的方法)?我想过一个.java解析器,你推荐一个吗?
答案 0 :(得分:2)
您可以模拟“otherClass”并验证该方法未被调用。例如。使用Mockito你甚至可以指定应该调用哪些方法(在他们的实例是模拟的情况下),并指定不允许调用哪些方法
作为coding.mof说,要模拟静态方法,你应该使用PowerMock / PowerMockito:
示例:
PowerMockito.mockStatic(OtherClass.class);
PowerMockito.verifyStatic(never());
OtherClass.otherClassStaticMethod();
答案 1 :(得分:1)
听起来你应该使用模拟库并让它为你处理它。我推荐JMock作为我的首选库。如果你正在使用实例方法,那么这对你来说是完美的 - 如果,如你的例子所示,它是静态方法,那么PowerMock可以工作* 1.
使用JMock,你会有类似的东西:
public class MyClass {
public MyClass(Dependency dependency) {
this.dependency = dependency;
}
void myMethod() {
dependency.someMethod();
}
}
@RunWith(JMock.class)
public class MyTest {
private Mockery context = new Mockery();
@Test
public void doesNotCallSomeMethod() {
Dependency dependency = context.mock(Dependency.class);
MyClass obj = new MyClass(dependency);
obj.myMethod(); <--- this will fail fast
}
}
当你调用obj.myMethod时,JMock会立即报告你从未说过依赖项应该有任何调用的方法。它还会告诉您DID调用的方法以及传入的参数(如果有的话)
* 1我不使用PowerMock,因为我避开静态方法,除非它们是纯函数