java - 如何模拟从另一个方法调用的方法

标签 java unit-testing junit powermock powermockito

我所处的场景

public class SecondClass{

    SecondClass(FirstClass fc){
    ...
    }

    public void foo(String a,String b){
        ....
    }
}

public class FirstClass{
    private SecondClass sc;
    public void init(){
        sc = new SecondClass(this);
    }

    public void bar(List<Integer> input){
        .....
        sc.foo(s1,s2);
    }
}

我想获取进入 foo 的字符串参数 a 和 b。测试类如下所示

@PrepareForTest({ FirstClass.class, SecondClass.class })
public class SampleTest
{
    private String[] texts;

    @Test
    public void testBar() throws Exception
    {
        texts = new String[2];

        final FirstClass fc = mock(FirstClass.class);
        final SecondClass sc = spy(new SecondClass(fc));

        doAnswer(invocation -> {
            texts = (String[]) invocation.getArguments();
            return null;
        }).when(sc).foo(anyString(), anyString());

        final List<Integer> input = new ArrayList<>();
        input.add(1);
        fc.bar(input);

        System.out.println(texts[0]+"<>"+text[1]);
    }
}

末尾的 sysout 打印 null<>null。为什么文本数组没有更新?

最佳答案

根本问题是 FirstClass 初始化它自己的 SecondClass 副本,而您想要提供模拟或类似的副本。

控制反转或依赖注入(inject)方法旨在通过为类提供操作所需的组件来缓解这种情况。您能否将 SecondClass 的副本注入(inject)FirstClass 中(例如通过 init() 的参数)?这样,您就可以在测试场景中提供模拟,从而测试您的方法调用。

例如

FirstClass fc = new FirstClass();
fc.init(myMockedSecondClass);
fc.bar(...);

// now test the invocations on your mock

关于java - 如何模拟从另一个方法调用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31950981/

相关文章:

c# - 单元测试 HtmlHelper 扩展方法失败

java - Spring Boot-如何通过实现BeforeAllCallback的自定义扩展类设置或覆盖application.yml中定义的属性?

java - 如何设置JTextField的透明文本颜色

java - 如何在txt文件中查找特定值或字符串并将其放入java中的表中?

java - 如何在java中保存地理位置

java - 在 Android 中使用 JSON 解析图像 url 和日期

java - 是否有能够重用 Given, Then 的 BDD java 框架? (具有不同的 When 步骤)

python - 如何使用脚本将 python 3 单元测试拆分为单独的文件来控制运行哪一个?

java - JUnit 和 Spring : Cannot find persistence. xml - 但它确实存在

java - java异常的catch block 中是否会捕获断言错误?