在 java 中模拟从私有方法返回的对象

Mocking an object returned from private method in java

我有一个要求,我想从私有方法中模拟一个 return 的对象。我在我的项目中使用 junit 和 mockito。我无法在此处粘贴实际代码,但示例代码如下所示。这里的限制是代码是遗留代码,我现在无法重构

Class 测试

 public class TestService {

   public String test() {
     TestDao testDao = getDaoObject();
     int num = testDao.getData();
     if (num < 10) {
       return "hey you loose";
     } else {
       return "hey you win";
     }
   }

   private TestDao getDaoObject() {
     return new TestDao();
   }
 }

道Class

public class TestDao {

  public int getData() {
    return 5;
  }
}

测试class

 public class JUnitServiceTestExample {
   @Test
   public void test() {
     TestDao testDao = Mockito.mock(TestDao.class);
     TestService test = new TestService();
     when(testDao.getData()).thenReturn(20);
     assertEquals(test.test(), "hey you win");
   }
 }   

请帮忙

您可以将 getDaoObjectprivate 稍微修改为 package-private,如下所示:

TestDao getDaoObject() {
   return new TestDao();
}

然后使用 Mockito.spy(new TestService()) 存根 getDaoObject() 和 return 你的模拟 testDao.

 public class JUnitServiceTestExample {
   @Test
   public void test() {
     TestDao testDao = Mockito.mock(TestDao.class);
     TestService test = Mockito.spy(new TestService());
     when(testDao.getData()).thenReturn(20);
     doReturn(testDao).when(test).getDaoObject();

     String result = test.test();

     assertEquals("hey you win", result);
   }
 }   

还有一个提示:assertEquals 的正确用法是 assertEquals(expected, actual) 而不是 assertEquals(actual, expected)