除了在Mockito中手动设置值以外,是否有一种方法来模拟POJO对象?

3

考虑一个在我的服务中返回类A的方法,

public List<A> method(){
A a=B.method_b();
List<A> list=new ArrayList<>();
for(A aa:a){
A classA=new A();
classA.setVal1(aa.getVal1());
list.add(classA);
}
        return list;
    }

我的POJO类

class A{
private int val1;
private int val2;
.
.
.
.
private int val10;
//setter and getter 
}

所以在测试用例中,我写成了

@Mock
B b;
@Test
public void check(){
 Mockito.when(b.method_b())
        .thenReturn(return_A());
}
private A return_A(){
A a=new A();
a.setVal1(1);
.
.
.
a.setVal10(10);
}

这里一切都运作正常。代码覆盖率也不错。但我的问题是,是否有可能使用mockito避免以上返回类A的私有方法?


你不需要使用Mockito。只需扩展B并覆盖method_b()以返回你的自定义值即可。 - shmosel
@shmosel 不是个好主意!如果B是一个接口并且随着时间推移不断添加新的方法,那么你就必须不断更改旧的单元测试... - Timothy Truckle
不,我只是想避免手动提供setter,因为即使我错过一个setter,我的测试用例也会失败。 - amjeremiad
@TimothyTruckle 我的假设是 B 是一个具体类。也许我错了。 - shmosel
即使如此,当使用模拟框架时,您可以稍后将“B”更改为接口而无需更改测试。这是单元测试的重要特性! - Timothy Truckle
4个回答

3
在一个单元测试中,根据输入您定义了您的类的行为。这意味着您必须指定这个输入。没有其他方法。
有不同的方法来做到这一点。
其中一种方法是像您之前配置DTO一样配置。
另一种方法是生成输入数据。但这样做有一些缺点: - 您仍然需要一个方法(或类)来完成这项工作, - 它使您的测试更难读懂和理解, - 它会在您的测试中引入故障可能性,从而使其不太可靠。
还有一种方法是在测试方法的//arrange部分仅设置当前测试所需的那些值。
@Mock
B b;
@Test
public void check(){
  // arrange
  Mockito.when(b.method_b())
        .thenReturn(return_A());
  A a=new A();
  // values to be used by cut in this test
  a.setVal1(1);
  a.setVal3(3); 

  // act
  // assert 
}

非常感谢@Timothy Truckle。所以,您的意思是我可以设置当前测试所需的值,并且没有其他选项可避免手动设置设置器值。 - amjeremiad
@Hemalatha:“所以,你的意思是我可以设置当前测试所需的值” 是的。- “而且没有其他选项可以避免手动设置setter值” 我说“没有其他有用的选项…” - Timothy Truckle
我明白了。非常感谢,@Timothy Truckle。 - amjeremiad

0

0

我非常高兴能够使用AutoFixture来进行.NET编程。

你可以查看JFixture来进行Java编程。

我认为这正是你想要的。


0
一个使用 PODAM 的解决方案
添加 gradle 依赖
testImplementation 'uk.co.jemos.podam:podam:7.2.5.RELEASE'

如何使用它?
PodamFactory podamFactory = new PodamFactoryImpl();
Student student = podamFactory.manufacturePojo(Student.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接