JUnit 5 和 Mockito:模拟 getter 和 setter

JUnit 5 and Mockito: Mocking getters and setters

如何在下面的实现中模拟 getter-setter 方法?

MyClass obj=new MyClass();

obj.getName().setFirstName("hello"); // How to Mock this part ? 

测试

@Mock
MyClass obj;

@Test
void testing(){

  doNothing().when(obj).getName().setName(anyString()); //this doesn't work

}

您无需设置值,只需定义将 getter return.

的值
when(obj.getName()).thenReturn("hello");

您需要将标志 RETURNS_DEEP_STUBS 添加到您的模拟中。

// if your mock is instantiated with the annotation
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
MyClass obj;

// if your mock is instantiated with the factory method
MyClass obj = Mockito.mock(MyClass.class, Answers.RETURNS_DEEP_STUBS)

这里的问题是涉及两个对象:您模拟的 MyClass 和 return 由 getName() 编辑的对象。你需要模拟他们两个。

@Mock
MyClass obj = new MyClass();
@Mock
MyName name = new MyName();
...
when(obj).getName().theReturn(name);
when(name).setName(anyString());

这允许您分别定义两个对象的行为。如果您想使用模拟完整调用链的 Mokito.RETURNS_DEEP_STUBS 功能,请参阅@Yassin 的回答。

显然,如果您正在尝试测试 class set/get 是否有效,并且 return 应该在 class 的具体实例上完成正确的事情而不是模拟对象。