是否可以使用 mockito 和 powermock 对具有 setter 和 getter 的方法进行单元测试
Is it possible to unit test a method which have setter and getter using mockito and powermock
我正在为遗留代码编写单元测试,它基本上是在使用链存根的方法中设置和获取值,我正在测试的 class 不依赖于其他 classes 所以我没有模拟任何东西,但有这样的方法
public class SampleClass {
public void process(Context context){
context.getState().setValue(MathUtil.roundToThree(context.getState().getValue());
}
}
我写的测试class如下:
@RunWith(MockitoJUnitRunner.class)
public class TestSampleClass{
SampleClass sample = new SampleClass();
@Test
public void testProcess(){
Context context = Mockito.mock(Context.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(context.getState().getValue()).thenReturn(4.12345);
sample.process(context);
assertEquals(4.123,context.getState().getValue(),0.0);
}
}
测试用例失败,因为它由于 Mockito.when() 而返回 4.12345 但我不确定在调用 process()
方法后如何测试 context
对象中的值.
我无法更改源代码。
初始化上下文非常困难,因为它依赖于很多其他 类。请帮忙。
问题是您的存根 State
对象不知道 getValue()
编辑的值 return 应该是传递给 setValue()
的最后一个值.
Mockito 创建的存根不会自动识别您有 getter 和 setter 并且 getter 应该 return 什么 setter 最后一次被调用。它只是一个愚蠢的存根,它只做你告诉它做的事情,而你没有告诉它在调用 setValue()
时做任何事情。
可能最简单的方法是验证 setValue
是用四舍五入的值调用的,而不是尝试从 getValue()
:
中获取它
Mockito.verify(context.getState()).setValue(AdditionalMatchers.eq(4.123, 0.0));
另一种方法是创建一个具有真实 getter 和 setter 的测试 State
class,并在您的测试中使用它。当然,你能不能做到这一点取决于这个class还有多少其他方法。如果你要写这样一个class(我在下面的代码中将其命名为TestState
),测试代码将如下所示:
@Test
public void testProcess2(){
Context context = Mockito.mock(Context.class);
Mockito.when(context.getState()).thenReturn(new TestState());
context.getState().setValue(4.12345);
sample.process(context);
assertEquals(4.123,context.getState().getValue(),0.0);
}
我正在为遗留代码编写单元测试,它基本上是在使用链存根的方法中设置和获取值,我正在测试的 class 不依赖于其他 classes 所以我没有模拟任何东西,但有这样的方法
public class SampleClass {
public void process(Context context){
context.getState().setValue(MathUtil.roundToThree(context.getState().getValue());
}
}
我写的测试class如下:
@RunWith(MockitoJUnitRunner.class)
public class TestSampleClass{
SampleClass sample = new SampleClass();
@Test
public void testProcess(){
Context context = Mockito.mock(Context.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(context.getState().getValue()).thenReturn(4.12345);
sample.process(context);
assertEquals(4.123,context.getState().getValue(),0.0);
}
}
测试用例失败,因为它由于 Mockito.when() 而返回 4.12345 但我不确定在调用 process()
方法后如何测试 context
对象中的值.
我无法更改源代码。 初始化上下文非常困难,因为它依赖于很多其他 类。请帮忙。
问题是您的存根 State
对象不知道 getValue()
编辑的值 return 应该是传递给 setValue()
的最后一个值.
Mockito 创建的存根不会自动识别您有 getter 和 setter 并且 getter 应该 return 什么 setter 最后一次被调用。它只是一个愚蠢的存根,它只做你告诉它做的事情,而你没有告诉它在调用 setValue()
时做任何事情。
可能最简单的方法是验证 setValue
是用四舍五入的值调用的,而不是尝试从 getValue()
:
Mockito.verify(context.getState()).setValue(AdditionalMatchers.eq(4.123, 0.0));
另一种方法是创建一个具有真实 getter 和 setter 的测试 State
class,并在您的测试中使用它。当然,你能不能做到这一点取决于这个class还有多少其他方法。如果你要写这样一个class(我在下面的代码中将其命名为TestState
),测试代码将如下所示:
@Test
public void testProcess2(){
Context context = Mockito.mock(Context.class);
Mockito.when(context.getState()).thenReturn(new TestState());
context.getState().setValue(4.12345);
sample.process(context);
assertEquals(4.123,context.getState().getValue(),0.0);
}