java - Mockito 在字段更改时模拟

标签 java mocking mockito

我有一个类

class A{

Map<String, String> obj;
B b;

public void method1(str1, str2, str3){
  obj = (new map dependent on str1 and str2)
  String str = b.method2(obj, str3)
  return str;
}

如何模拟 b.method2。我的意思是我想测试 method1 并检查是否返回了正确的字符串。为此,我想执行 when(b.method2()).thenReturn("myStr").

最佳答案

这是一个完整的工作示例:

public class B {
    public String method2(Map<String, String> obj, String str3) {
        // this is irrelevant for our test of A
        return null;
    }
}

public class A {

    private Map<String, String> obj;
    private B b;

    public A(B b) {
        this.b = b;
    }

    /**
     * Replaces the internal obj map to a new Map containing str1 as key and str2 as value,
     * and calls b.method2() with that map and str3.
     * @return the value returned by b.method2()
     */
    public String method1(String str1, String str2, String str3) {
        obj = new HashMap<>();
        obj.put(str1, str2);
        String str = b.method2(obj, str3);
        return str;
    }

    public Map<String, String> getObj() {
        return obj;
    }
}

public class ATest {
    @Test
    public void method1ShouldCallMethod2WithCreatedMap() {
        B mockB = mock(B.class);

        Map<String, String> expectedMap = new HashMap<>();
        expectedMap.put("hello", "world");

        when(mockB.method2(expectedMap, "!")).thenReturn("ok");
        A a = new A(mockB);
        String result = a.method1("hello", "world", "!");
        assertEquals("ok", result);
        assertEquals(expectedMap, a.getObj());
    }

    // Same test, other technique
    @Test
    public void method1ShouldCallMethod2WithCreatedMap2() {
        B mockB = mock(B.class);


        when(mockB.method2(Mockito.<Map<String, String>>any(), anyString())).thenReturn("ok");
        A a = new A(mockB);
        String result = a.method1("hello", "world", "!");
        assertEquals("ok", result);

        Map<String, String> expectedMap = new HashMap<>();
        expectedMap.put("hello", "world");

        assertEquals(expectedMap, a.getObj());
        verify(mockB).method2(expectedMap, "!");
    }
}

关于java - Mockito 在字段更改时模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31415651/

相关文章:

java - Android 应用程序 Activity

java - 我什么时候应该使用惰性单例而不是普通单例?

java - 将代码移入包后出现 UnsatisfiedLinkError

java - 使用 Selenium Webdriver 获取 div 中的项目列表

node.js - 如何让 sinon mock 在不同的调用上返回不同的对象?

c++ - 哪些模拟框架允许对遗留代码进行零更改?

objective-c - 在 Objective-C 中,让您的委托(delegate)符合多个协议(protocol)是不是不好的做法?

java - Mockito 模拟父类(super class)调用

java - 在 Mockito 中模拟 DAO

java - 单元测试和日志返回