代码之家  ›  专栏  ›  技术社区  ›  Ganesh Satpute

重构:创建新实例的Mockito

  •  1
  • Ganesh Satpute  · 技术社区  · 6 年前

    我有一个类是其他应用程序的客户端。

    class StarFleetClient {
        private RestTemplate restTemplate = null;
        private String accessToken = null;
    
        public StarFleetClient(String address, String username, String password) {
            restTemplate = new RestTemplate();
            accessToken = restTemplate.postForEntity(...);
        }
    
        public String attack() {
            return restTemplate.exchange(... )
        }
    }
    

    new StarFleetClient("address1", "user1", "pass");
    

    其他时间

    新的StarFleetClient(“address1”,“user1”,“pass”);
    

    等等。。。

    RestTemplate 但是由于新实例正在创建中,我无法正确地进行模拟。

    如何为此编写测试用例?或者我怎样才能使代码可测试?

    2 回复  |  直到 6 年前
        1
  •  0
  •   pleft    6 年前

    你可以用 @Mock @InjectMocks 注解来实现你想要的。为了简单起见,我把 restTemplate.postForEntity restTemplate.exchange restTemplate.toString() 在我的代码摘录中。

    所以,考虑到 StarFleetClient :

    class StarFleetClient {
        private RestTemplate restTemplate = null;
        private String accessToken = null;
    
        public StarFleetClient(String address, String username, String password) {
            restTemplate = new RestTemplate();
            accessToken = restTemplate.toString();
        }
    
        public String attack() {
            return restTemplate.toString();
        }
    }
    

    一个模拟测试 RestTemplate

    @RunWith(MockitoJUnitRunner.class)
    public class StarFleetClientTest {
    
        @Mock
        RestTemplate restTemplate;
    
        @InjectMocks
        StarFleetClient starFleetClient = new StarFleetClient("somewhere", "user", "password");
    
        @Test
        public void testStarFleetAttack() {
            Mockito.when(restTemplate.toString()).thenReturn("called Mocked RestTemplate");
            assertEquals("called Mocked RestTemplate", starFleetClient.attack());
        }
    }
    
        2
  •  -1
  •   Akli REGUIG    6 年前

    您需要模拟RestTemplate

     @Mock
     RestTemplate restTemplate;
    

    并找到一种方法将其注入正在测试的类中(通过setter或构造函数)。 因为您使用的是spring,所以restemplate可能是应用程序中的一个bean,可以被测试上下文的mock替换。

    然后使用mockito来模拟您想要的行为:

    Mockito.when(restTemplate.get...)
                .thenReturn(something);