簡體   English   中英

具有內部對象的Java單元測試

[英]Java unit test with inner object

我有以下兩節課

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嘗試了很少的模式,但沒有成功。

請提出一些好的建議。

我認為您需要Mockito擴展Powermock ,因為它需要更改類的字節碼。 有關如何操作的說明,請參見模擬新對象的構造

主要工具可能是expectNewcreateMockAndExpectNew 前(未經測試,可能會丟失一些東西,但大致方向):

Test1 mockedTest1 = createMockAndExpectNew(Test1, any(Integer));
expect(mockedTest1.getValue()).andReturn(42);
replayAll(); // setup all objects maintained by Powermock.
assertEquals(new SampleTest().getResult(), 43);

您絕對可以在當前擁有的類中使用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);

通過這種設計,您可以輕松地在兩個類之間進行耦合,並且測試可以清楚地顯示它們之間的關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM