Java JUnit5和Mockito:模仿获得者和设定者

Java JUnit5和Mockito:模仿获得者和设定者,java,spring-boot,junit,mockito,Java,Spring Boot,Junit,Mockito,如何在下面的实现中模拟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 wo

如何在下面的实现中模拟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返回的值即可

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

您需要的是将标志
返回\u DEEP\u 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
getName()
返回的对象。你需要嘲笑他们两个

@Mock
MyClass obj = new MyClass();
@Mock
MyName name = new MyName();
...
when(obj).getName().theReturn(name);
when(name).setName(anyString());
这允许您分别定义两个对象的行为。如果您想使用
Mokito,请参阅@Yassin的答案。返回\u DEEP\u STUBS
功能,模拟整个调用链


显然,如果您试图测试类是否应该在类的具体实例上而不是在模拟对象上设置/获取工作并返回正确的内容。

mock/spy
obj.getName()的返回值
然后期望在该模拟中调用
setFirstName
。如果在您要测试的行之前有
new MyClass
语句,那么您基本上已经不走运了,您到底想测试什么以及代码在一开始有什么意义都很值得怀疑!通常最好不要模拟普通数据对象;如果
Name
只是一个POJO,则不需要模拟。嘲弄是为了行为。