在mockito spy中验证另一个类的方法

acruukt9  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(56)

我有两个类,一个在另一个里面工作

public class Class1 {
    public Class1(){}

    public void myMethod(List<String> list){
        for (String element: list){
            Class2 class2 = new Class2(element);
            class2.anotherMethod();
        }
    }
}

public class Class2 {
    private final String element;

    public Class2(String element) {
        this.element = element;
    }

    public void anotherMethod(){
        // do stuff
    }
}

我的问题是,我如何才能监视Class1并检查当我调用class1.myMethod时,class2对象被创建 * 一次,用于列表中的每个元素 *,并在同一块中调用anotherMethod?
我正在使用Java 11和Mockito 3.5,无法更改项目的POM。

vfwfrxfs

vfwfrxfs1#

一般来说,模拟对象的构造存在设计问题,重构可测试性应该是一个更好的解决方案。(例如,按照Andrew S的建议将Class2Factory注入到类中)
但如果重构不可行,
我们可以利用模拟对象结构

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mockConstruction;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.jupiter.api.Test;
import org.mockito.MockedConstruction;

import java.util.Arrays;
import java.util.List;

class Class1Test {
    @Test
    void myMethod_createClass2PerItemAndCall_anotherMethod() {
        try (MockedConstruction<Class2> mocked = mockConstruction(Class2.class, (mock, context) -> {
            // simulate the construction, in case you want to verify construction argument
            when(mock.getElement()).thenReturn((String) context.arguments().get(0));
        })) {
            Class1 class1 = new Class1();
            class1.myMethod(Arrays.asList("a", "b", "c"));

            List<Class2> mockedInstances = mocked.constructed();
            assertEquals(3, mockedInstances.size());
            // in case construction argument checking is needed
            assertEquals("a", mockedInstances.get(0).getElement());
            assertEquals("b", mockedInstances.get(1).getElement());
            assertEquals("c", mockedInstances.get(2).getElement());
            verify(mockedInstances.get(0)).anotherMethod();
            verify(mockedInstances.get(1)).anotherMethod();
            verify(mockedInstances.get(2)).anotherMethod();
        }
    }

}

public class Class2 {
    ...

    // for verify constructor argument
    String getElement() {
        return element;
    }
}

相关问题