Java 在抽象类中测试未实现的方法
我有一个抽象类,比如说Java 在抽象类中测试未实现的方法,java,junit,abstract-class,mockito,Java,Junit,Abstract Class,Mockito,我有一个抽象类,比如说AbstractClass,其中我有一个没有实现的公共void方法myMethod。当我测试这个类时,我创建了一个匿名子类,在那里我可以实现我认为合适的myMethod。 在AbstractClass中还有另一个方法,比如myImplementedMethod,它调用myMethod。我可以在匿名子类中放入myMethod,以便能够验证它是否已被调用,这有什么诀窍吗 编辑: 我使用Mockito进行模拟,我不适合使用其他框架 public abstract class Ab
AbstractClass
,其中我有一个没有实现的公共void方法myMethod
。当我测试这个类时,我创建了一个匿名子类,在那里我可以实现我认为合适的myMethod
。
在AbstractClass
中还有另一个方法,比如myImplementedMethod
,它调用myMethod
。我可以在匿名子类中放入myMethod
,以便能够验证它是否已被调用,这有什么诀窍吗
编辑:
我使用Mockito进行模拟,我不适合使用其他框架
public abstract class AbstractClass {
public abstract void myMethod();
public void myImplementedMethod() {
myMethod();
}
public class AbstractClassTest {
@Before
public void setUp() {
AbstractClass myClass = new AbstractClass() {
@Override
public void myMethod(){
//What could I put here?
}
}
}
@Test
public void testMyImplementedMethod() {
myClass.myImplementedMethod();
//check that myMethod is called.
}
}
您可以在您的子类上创建一个spy对象,调用实现的方法,然后确保使用
verify
AbstractClass myInstance= Mockito.spy(myClass);
myInstance.myImplementedMethod();
Mockito.verify(myInstance).myMethod();
您可以在您的子类上创建一个spy对象,调用实现的方法,然后确保使用
verify
AbstractClass myInstance= Mockito.spy(myClass);
myInstance.myImplementedMethod();
Mockito.verify(myInstance).myMethod();
你不能像这样使用反射api吗
YourClass.getClass().getMethod("myMethod").invoke(obj,args); // pass the appropriate parameters
如果这引发了异常,那么您还没有实现该方法。
我自己也没有尝试过,如果可以的话,请发表评论。你不能像这样使用反射api吗
YourClass.getClass().getMethod("myMethod").invoke(obj,args); // pass the appropriate parameters
如果这引发了异常,那么您还没有实现该方法。
我自己也没试过,如果有用的话,请发表评论。如果莫基托的间谍对你有用,那太好了。但是,我认为它不会捕获内部方法调用。下面这个怎么样
public class AbstractClassTest {
boolean methodCalled = false;
@Before
public void setUp() {
methodCalled = false;
AbstractClass myClass = new AbstractClass() {
@Override
public void myMethod(){
methodCalled = true;
}
}
}
@Test
public void testMyImplementedMethod() {
assertFalse(methodCalled);
myClass.myImplementedMethod();
assertTrue(methodCalled);
}
}
如果莫基托的间谍对你有用,那太好了。但是,我认为它不会捕获内部方法调用。下面这个怎么样
public class AbstractClassTest {
boolean methodCalled = false;
@Before
public void setUp() {
methodCalled = false;
AbstractClass myClass = new AbstractClass() {
@Override
public void myMethod(){
methodCalled = true;
}
}
}
@Test
public void testMyImplementedMethod() {
assertFalse(methodCalled);
myClass.myImplementedMethod();
assertTrue(methodCalled);
}
}
看看mocking框架。哦,我正在使用mockito,然后检查它是否被调用。如果子类不存在,它甚至无法编译。你具体想测试什么?我该如何检查它是否被调用?看看模拟框架。哦,我正在使用mockito,然后检查它是否被调用。如果子类不存在,它甚至无法编译。你具体想测试什么?我该如何检查它的名称?我不相信间谍会起作用。我相信间谍只能验证对方法的外部调用,而不是内部调用。间谍是用来模拟真实对象的,当然不会这样做。真正的工作是verify(),它确保在myInstance上调用myMethod。老实说,我真的认为这是正确的方法,你的解决方案就像是重新发明轮子。我也对你的解决方案持开放态度。我还想知道为什么使用间谍是合理的,根据Mockito文档,这是有点不鼓励的。我同意应该谨慎使用间谍的理由,但我发现有些情况下我需要使用间谍,例如在使用第三方或遗留代码时。在您的情况下,您可以完全控制修改您的子类(您甚至创建了一个仅用于测试的类),但在其他一些情况下,情况可能并非如此。您是对的。文件没有明确说明这一点,但已经试用过了,而且确实有效。我不相信间谍会起作用。我相信间谍只能验证对方法的外部调用,而不是内部调用。间谍是用来模拟真实对象的,当然不会这样做。真正的工作是verify(),它确保在myInstance上调用myMethod。老实说,我真的认为这是正确的方法,你的解决方案就像是重新发明轮子。我也对你的解决方案持开放态度。我还想知道为什么使用间谍是合理的,根据Mockito文档,这是有点不鼓励的。我同意应该谨慎使用间谍的理由,但我发现有些情况下我需要使用间谍,例如在使用第三方或遗留代码时。在您的情况下,您可以完全控制修改您的子类(您甚至创建了一个仅用于测试的类),但在其他一些情况下,情况可能并非如此。您是对的。文件没有明确说明这一点,但已经试用过了,而且确实有效。我不相信间谍会起作用。我相信间谍只能验证对方法的外部调用,而不能验证内部调用。如果你不相信,你可以检查它并读取mockito的文档。如果我的回答不是真的。不要犹豫,投我的票吧。你是对的。文件没有明确说明这一点,但已经试用过了,而且确实有效。我不相信间谍会起作用。我相信间谍只能验证对方法的外部调用,而不能验证内部调用。如果你不相信,你可以检查它并读取mockito的文档。如果我的回答不是真的。不要犹豫,投我的票吧。你是对的。文档没有明确说明这一点,但已经尝试过了,而且确实有效。回答得好。这正是我所希望的优雅,尤其是因为不鼓励使用莫基托的间谍。回答得好。这正是我所希望的优雅,尤其是因为不鼓励使用莫基托的间谍。