【问题标题】:How do I test the methods of with Mockito/Powermockito如何测试使用 Mockito/Powermockito 的方法
【发布时间】:2016-10-07 10:20:53
【问题描述】:

我有一个类需要进行单元测试:

public class AMQProducer {

     private final String TCP = "tcp://";
     private final String COLON = ":";

     AMQProducer() {

     }

     public AMQProducer(String ip, long port) throws JMSException {
      try {
       ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(TCP + ip + COLON + port);
       Connection connection = connectionFactory.createConnection();
      } catch (JMSException e) {
       throw e;
      }
     }
    }

我有一个测试用例:

@RunWith(PowerMockRunner.class)
@PrepareForTest()
public class TestAMQProducer {

 @Mock
 Connection connection;

 @Mock
 ActiveMQConnectionFactory connectionFactory;

 @Test
 public void test() throws Exception {
  PowerMockito.whenNew(ActiveMQConnectionFactory.class).withAnyArguments().thenReturn(connectionFactory);
  PowerMockito.when(connectionFactory.createConnection()).thenReturn(connection);
  AMQProducer producer = new AMQProducer("random", 1234);
 }
}

当我运行测试用例时,没有使用 ActiveMQConnectionFactory 的模拟对象。相反,正在使用实际实现,并且正在建立 TCP 连接:

javax.jms.JMSException: Could not connect to broker URL: tcp://random:2333. Reason: java.net.UnknownHostException: random

我尝试了 Powermockito 和 Mockito,但都失败了。如何模拟对象以及如何成功运行测试用例?

我是单元测试的新手,并试图从各个社区获得帮助,但没有找到合适的答案。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 在@Before 方法中初始化你的模拟对象
  • 你不在构造函数之外使用connection 吗? TCPCOLON 真的与 AMQProducer 的域相关吗?

标签: java unit-testing junit mockito powermockito


【解决方案1】:

您无法使用代码的当前结构对其进行测试 - 您在构造函数中创建 new ActiveMQConnectionFactory。改用依赖注入。

使用 Mockito:

public class AMQProducer {

    AMQProducer() {}

    public AMQProducer(ActiveMQConnectionFactory connectionFactory) throws JMSException {
        Connection connection = connectionFactory.createConnection();
    }

}

public class TestAMQProducer {

    private final Connection connection = mock(Connection.class);
    private final ActiveMQConnectionFactory connectionFactory = mock(ActiveMQConnectionFactory.class);

    @Test
    public void test() throws Exception {
        doReturn(connection).when(connectionFactory).createConnection();

        // actual test here
    }

}

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多