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 的具体实例上完成正确的事情而不是模拟对象。
如何在下面的实现中模拟 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 的具体实例上完成正确的事情而不是模拟对象。