Java 有没有办法模拟pojo,然后在mockito中手动设置值?

Java 有没有办法模拟pojo,然后在mockito中手动设置值?,java,junit,mockito,Java,Junit,Mockito,假设一个方法在我的服务中返回类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; } 所以在测试用例中,我写为 @Mock B b; @Test p

假设一个方法在我的服务中返回类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;
    }
所以在测试用例中,我写为

@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的上述私有方法?

在单元测试中,您可以根据输入定义类的行为。 这意味着您必须指定此输入。这是没有办法的

有不同的方法可以做到这一点

一种方法是按照您的方式配置数据

另一种方法是生成输入数据。但这有一些小网站:
-您仍然需要一个方法(或类)来实现这一点,
-它使您的考试更难阅读和理解,
-它会在测试中引入失败的可能性,从而降低可靠性

还有一种方法是在测试方法的
//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 
}
我遇到了这个问题。如果不想手动设置值(硬编码值),这可能有助于提供setter值。

添加渐变依赖项

testImplementation 'uk.co.jemos.podam:podam:7.2.5.RELEASE'
如何使用它

PodamFactory podamFactory = new PodamFactoryImpl();
Student student = podamFactory.manufacturePojo(Student.class);

你不应该需要莫基托。只需扩展
B
并覆盖
方法B()
即可返回自定义值。@shmosel坏主意!什么id B是一个接口,随着时间的推移会得到新的方法?您必须不断地更改旧的单元测试……不,我只是想避免手动提供setter,因为即使我错过了一个setter,我的测试用例也会失败。@TimothyTruckle我的假设是
B
是一个具体的类。也许我弄错了。@shmosel即使是这样,当使用模拟框架时,您可以在不更改测试的情况下将
B
更改为接口。这是单元测试的一个重要特性!非常感谢@Timothy Truckle。那么,你是说我可以设置当前测试所需的值,没有其他选项可以避免手动设置设置值。@Hemalatha“那么,你是说我可以设置当前测试所需的值”是。-“没有其他选项可以避免手动设置setter值”我说“没有其他有用的选项…”我明白了。非常感谢@Timothy Truckle
PodamFactory podamFactory = new PodamFactoryImpl();
Student student = podamFactory.manufacturePojo(Student.class);