junit 集合中的模拟对象

huus2vyu  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(107)

我有以下课程:

@Getter //lombok
@AllArgsConstructor //lombok
public class A {
    private Set<B> bSet;

    public void aMethod() {
        for (B b: bSet) b.bMethod();
    }
}

@AllArgsConstructor //lombok
public class B {
    public void bMethod() { 
        //do something
    }
}

我想写一个测试来检查bSet的每个元素是否都调用了bMethod(),而不关心bMethod()的实现。
这是我需要成功的JUnit测试用例:

@Test
    public void givenAWithBSet_whenAMethodIsCalled_thenCallBMethodOnAllBs() {
        //GIVEN a with bSet
        Set<B> bSet = new HashSet<>();
        bSet.add(new B());
        bSet.add(new B());
        
        A a = new A(bSet);

        //WHEN aMethodIsCalled
        a.aMethod();

        //then call bMethod on all bs
        bSet.forEach(b -> verify(b, times(1)).bMethod());
        bSet.forEach(Mockito::verifyNoMoreInteractions);
    }

我试着嘲笑它,但没有成功,需要你的帮助

xxe27gdn

xxe27gdn1#

如果您只想验证Set中的每个B都调用了它的bMethod,您可以像这样设置您的测试:

@Test
public void givenAWithBSet_whenAMethodIsCalled_thenCallBMethodOnAllBs() {
    Set<B> bSet = new HashSet<>();
    for (int i = 0; i<10; i++) {
        bSet.add(Mockito.mock(B.class));
    }

    A a = new A(bSet);

    a.aMethod();

    for (B b : a.getBSet()) {
        verify(b).bMethod();
    }
}

它将验证每个mock是否都调用了bMethod,使用相同的mock是很好的,但是当您使用Set并且mock使用identity函数来实现相等时,您需要创建多个mock。

相关问题