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的文档。如果我的回答不是真的。不要犹豫,投我的票吧。你是对的。文档没有明确说明这一点,但已经尝试过了,而且确实有效。回答得好。这正是我所希望的优雅,尤其是因为不鼓励使用莫基托的间谍。回答得好。这正是我所希望的优雅,尤其是因为不鼓励使用莫基托的间谍。