当前位置: 首页 > 知识库问答 >
问题:

内部对象的Java单元测试

赵立果
2023-03-14

我有以下两门课

public class SampleTest {
   public Integer getResult() {
     Test1 test1 = new Test1(5);
     Integer j = doSomeThing(test1);
     return j;
   }

   public Integer doSomeThing(Test1 test1){
     Integer p = test1.getValue();
     return p+1;
   }
}

public class Test1 {
  Integer i;
  Test1(Integer i){
    this.i = i*2;
  }

  Integer getValue(){
    return i;
  }

我想对SampleTest getResult()进行单元测试,但我想在这里模拟Test1(),这样我就可以返回我在UnitTests中设置的任何值。这些课我都改不了。

我使用Mockito尝试了一些模式,但没有成功。

请提出一些好的建议。

共有2个答案

燕元明
2023-03-14

你绝对可以把Mockito和你现在拥有的类一起使用。我建议您为SampleTest添加一个构造函数,在该构造函数中通过一个test1实例

public SampleTest(Test1 test1) {
    this.test1 = test1;
}

然后,getResult方法可以使用以下Test1客户端:

public Integer getResult() {
    Integer j = doSomeThing(this.test1);
    return j;
}

最后,您可以模拟test1实例,让它返回您想要的任何内容:

Test1 test1 = Mockito.mock(Test1.class);
Mockito.when(test1.getValue()).thenReturn(42);
SampleTest sampleTest = new SampleTest(test1);
Assertions.assertThat(sampleTest.getResult()).isEqualTo(43);

通过这种设计,您可以在两个类之间进行松散耦合,并且您的测试可以清楚地显示它们之间的关系。

施学
2023-03-14

我认为您需要Mockito扩展Powermock,因为它需要更改类的字节码。有关如何执行此操作的说明,请参阅新对象的模拟构造。

主要工具可能是expectNewcreateMockAndExpectNew。Ex(未经测试,可能遗漏了一些内容,但大致方向):

Test1 mockedTest1 = createMockAndExpectNew(Test1, any(Integer));
expect(mockedTest1.getValue()).andReturn(42);
replayAll(); // setup all objects maintained by Powermock.
assertEquals(new SampleTest().getResult(), 43);
 类似资料:
  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte

  • 问题内容: 我有一个要测试的类。只要有可能,我都会对该类进行依赖注入,该注入依赖于其他类的对象。但是,我遇到了一种情况,我想在不重新构造代码的情况下模拟对象,而不是应用DI。 这是要测试的课程: 我为此的测试课程是: 我想不出一种解决方案来模拟Dealer类中的打印对象。自从我在Test类中对其进行了模拟,但是它是在被测试的方法中创建的。我做了研究,但找不到任何好处。资源。 我知道从该方法中创建P

  • 问题内容: 我有以下代码。我想掌握用来创建内部类对象的外部类对象。我该怎么做? 编辑:好,你们中的一些人建议通过添加方法来修改内部类: 但是,如果我没有控制权来修改内部类,那(只是确认一下),我们还有其他方法可以从内部类对象中获取相应的外部类对象吗? 问题答案: 在内部类本身中,你可以使用。该表达式允许引用任何词法包围的实例,在JLS中被描述为。 我认为没有办法从内部类的代码之外获取实例。当然,你

  • 我试图使用注释将JSON数据转换为XML。我的有点像这样: 我想使用封送来创建看起来如下所示的XML:(请注意标记,它在中没有,但我需要在中添加) 我有以下几门课: 我的main类实际上会读取JSON数据并将其封送为XML。我使用Jackson读取JSON数据,为了简单起见,我删除了这些代码: 以下是我的类: 以下是我创建的类,它作为标记将不会出现在传入的JSON中,但我需要在封送处理期间将其添加

  • 我的“BBService”对象在这里为空 我是不是漏掉了什么?

  • 我试图讨论下面SonarQube通过代码覆盖的if条件。SonarQube说2个条件中的1个都被覆盖了。如果有人能帮我把这两件事都盖上,我将不胜感激。 我已经声明了变量,并拥有了setter和getter。 下面是我要介绍的代码: 下面是测试2个条件中的1个条件的代码: