Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对构造函数中创建的匿名内部类进行单元测试_Java_Unit Testing_Anonymous Inner Class - Fatal编程技术网

Java 如何对构造函数中创建的匿名内部类进行单元测试

Java 如何对构造函数中创建的匿名内部类进行单元测试,java,unit-testing,anonymous-inner-class,Java,Unit Testing,Anonymous Inner Class,下面是我要测试的类: public class MyView extends FrameworkView { public MyView(Repository repository) { repository.addEventListener(event -> { refresh(); }); } } 及其母公司: public class FrameworkView { protected final v

下面是我要测试的类:

public class MyView extends FrameworkView {
    public MyView(Repository repository) {
        repository.addEventListener(event -> {
            refresh();
        });
    }
}
及其母公司:

public class FrameworkView { 
    protected final void refresh() {
        // do framework magic to refresh the view
    }
}
我想对MyView进行单元测试。我可以使用ArgumentCaptor获取侦听器(使用Mockito):

然后测试将变成:

@Test
public void test() {
    Repository repository = mock(Repository.class);
    MyView instance = Mockito.spy(new MyView(repository));
    ....
    verify(instance, times(1)).doRefresh();

但我觉得这很难看。有人有更好的解决方案吗?

我认为您的解决方案还可以,因为您隔离了需要测试的行为,并且认为refresh()是最终的解决方案。我很想知道其他人会怎么说。对我来说,兴趣的方法被标记为final似乎是个大问题。我认为你在这个问题上处理得很好。从单元测试的角度来看,实际上您只需要验证该方法是否被调用一次,所以您可以通过添加doRefresh()方法来实现这一点。不同的模拟工具包,如JMockit,如果感兴趣的话,可以模拟最终的方法——不过,单元测试的重点还是验证与超类依赖关系的交互。真的,你不应该编写几十行测试代码,测试由少于二十个非空白字符组成的lambda表达式(十六个,如果您将其简化为
事件->刷新()
),尤其是当唯一要测试的是lambda表达式
事件->{refresh();}
是否真的调用了
刷新()
。事实上,引入另一个委托方法,
doRefresh()
,这会增加出现bug的可能性(如何测试
doRefresh()
调用
refresh()呢)
正确吗?它与lambda表达式具有相同的复杂性。不要为一行代码编写测试用例。我理解并同意你的观点。但不测试这一点就像是放弃。即使它是一行代码,也可能是类的关键行为,我想测试它。删除人工
doRefresh()
方法确实不能真正解决这个问题,但会尽可能接近。超级类中的最终方法只是一个PITA!
public class MyView extends FrameworkView {
    public MyView(Repository repository) {
        repository.addEventListener(event -> {
            doRefresh();
        });
    }

    void doRefresh() {
        refresh();
    }
}
@Test
public void test() {
    Repository repository = mock(Repository.class);
    MyView instance = Mockito.spy(new MyView(repository));
    ....
    verify(instance, times(1)).doRefresh();