【问题标题】:AssertJ and Mockito: check a slightly complex JTable event?AssertJ 和 Mockito:检查一个稍微复杂的 JTable 事件?
【发布时间】:2016-10-11 14:36:05
【问题描述】:

我正在阅读《以测试为指导的发展面向对象的软件》一书。

但我使用的是 AssertJ 和 Mockito,而不是 Hamcrest 和 jMock。

我之前需要检查与JTable 的第 0 行关联的一个或多个表事件的发生。

    // verify that one or more events in row 0 happen
    verify(listener, atLeastOnce() ).tableChanged(refEq(new TableModelEvent(model, 0)));

(请注意,几天前,Mureinik here 向我介绍了 refEq)。

现在我需要检查一个TableModelEvent 是否出现在第0 行,属于TableModelEvent.UPDATE 类型。这本书有:

one( listener ).tableChanged( with( aChangeInRow( 0 )));

...aChangeInRow 似乎来自 jMock。

注意TableModelEvent 有一个有用的方法getType()。这是我想写的:

    // verify that precisely one ***change*** event happens in row 0
    // *** CAVEAT: ERRONEOUS CODE ***
    verify( listener ).tableChanged(refEq(new TableModelEvent(model, 0))).getType().isEqualTo( TableModelEvent.UPDATE );

但这甚至不能编译...我应该写什么?

更一般地说,是否有一种 AssertJ/Mockito 技术可以提取作为参数传递的值(这里是 TableModelEvent)到经过验证的方法,以便对其进行任何您想要的测试?

【问题讨论】:

    标签: tdd mockito hamcrest jmock assertj


    【解决方案1】:

    如果您不想使用 Hamcrest,则必须编写自己的匹配器来验证 getType 方法的结果。

    ArgumentMatcher<RockData> checkTypeMatcher = new ArgumentMatcher<TableModelEvent>() {
    
    
    public boolean matches(Object arg0) {   
        //put more logic here
        TableModelEvent event = (TableModelEvent) arg0; 
        return event.getType() == TableModelEvent.UPDATE;
    }
    };
    
    verify( listener ).tableChanged(Mockito.argThat(checkTypeMatcher) );
    

    更新:使用 ArgumentMatcher 表单 Mockito。

    ArgumentMatcher 类来自 Mockito。

    【讨论】:

    • 谢谢...但是(除非我误解了)MatcherBaseMatcher 确实是 Hamcrest 类。可能没有不含 Hamcrest 的解决方案(此时我太喜欢测试新手了,因此是这个问题),但如果是这样,我会感到非常惊讶......
    • 对,但您可以使用 Mockito 的 ArgumentMatcher 类。请参阅上面的更新。
    • 好的,谢谢......不过,我只是想知道是否可能没有一种更符合 AssertJ 的“流利”精神的 AssertJ 技术?在我看来(正如我所说,我是新手)与我的其他问题并非无关,即您的解决方案也不会检查发生此更新的行号......我只是认为可能有以某种方式同时兼顾的解决方案,可能是通过将两个 AssertJ 方法“串连”在一起。
    【解决方案2】:

    Mockito API 可与 Hamcrest 匹配器一起使用。你必须坚持下去。

    我并没有真正看到坚持使用 AssertJ 匹配器的意义,但如果你真的想要,你可以捕获 ArgumentCaptor,然后使用 AssertJ。

    ArgumentCaptor<TableModelEvent> cap = ArgumentCaptor.forClass(TableModelEvent.class);
    verify(listener).tableChanged(cap.capture());
    
    TableModelEvent value = cap.getValue();
    assertThat(value).isNotNull();
    

    【讨论】:

    • 谢谢...只是作为一个测试新手,我对所有这些不同的框架感到很困惑。我读过几本关于 TDD 的书,提出了几点:首先是 AssertJ 的良好可读性,其次是 AssertJ 方法的“流畅”(即把它们串在一起)特性,第三是一些报告的与冲突有关的问题Hamcrest 的版本(例如,当您使用 Gradle 时,JUnit 与特定的 Hamcrest 捆绑在一起)......但如果我必须熟悉 Hamcrest,那就这样吧!
    • Hamcrest 似乎停滞不前。即使是现代版本的 Mockito 也已经与 Hamcrest 分离,并且没有将其作为依赖项(尽管如果需要,您仍然可以将它们一起使用)。 AssertJ 仍在积极开发中,并且有很多方便的匹配器。
    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多