Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以使用mockito和powermock对具有setter和getter的方法进行单元测试_Java_Junit_Mockito_Powermock - Fatal编程技术网

Java 是否可以使用mockito和powermock对具有setter和getter的方法进行单元测试

Java 是否可以使用mockito和powermock对具有setter和getter的方法进行单元测试,java,junit,mockito,powermock,Java,Junit,Mockito,Powermock,我正在为一个遗留代码编写单元测试,它基本上是使用链存根在方法中设置和获取值,我正在测试的类不依赖于其他类,所以我没有模拟任何东西,而是有这样一个方法 public class SampleClass { public void process(Context context){ context.getState().setValue(MathUtil.roundToThree(context.getState().getValue()); } } 我编写的测试类如下: @Run

我正在为一个遗留代码编写单元测试,它基本上是使用链存根在方法中设置和获取值,我正在测试的类不依赖于其他类,所以我没有模拟任何东西,而是有这样一个方法

public class SampleClass {
  public void process(Context context){
    context.getState().setValue(MathUtil.roundToThree(context.getState().getValue());
  }
}
我编写的测试类如下:

@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
对象中测试值

我无法更改源代码。
初始化上下文非常困难,因为它依赖于太多其他类。请帮忙

问题在于,存根
状态
对象不知道
getValue()
返回的值应该是传递给
setValue()
的最后一个值

Mockito创建的存根不会自动识别您有一个getter和setter,getter应该返回setter上次调用的内容。它只是一个愚蠢的存根,只执行您让它执行的操作,而在调用
setValue()
时,您没有让它执行任何操作

验证是否使用舍入值调用了
setValue
,而不是尝试从
getValue()
获取它,这可能是最简单的方法:

另一种方法是创建一个具有真正getter和setter的test
State
类,并在测试中使用它。当然,是否可以这样做取决于这个类有多少其他方法。如果要编写这样一个类(我在下面的代码中将其命名为
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);
}

我对此不确定,但您不设置值,我认为您应该尝试如下操作:context.getState().setValue(4.12345);为什么不能用一个非常简单的单元测试来测试
MathUtil.roundToThree()
方法呢?非常感谢。我同意你的第一种方法。
@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);
}