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

如何使用Mockito/Powermockito测试

太叔昊苍
2023-03-14

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

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,但都失败了。如何模拟对象,如何成功运行测试用例?

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

共有1个答案

范京
2023-03-14

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

莫基托:

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
    }

}
 类似资料:
  • 我确信这是一个很常见的问题,但我真的无法摆脱这个问题,我正在嘲弄私有方法,它内部调用另一个方法并返回一个集合。类有一个公共方法,它调用私有方法来获取集合对象。我使用PowerMock创建了一个私密方法的间谍。 测试类-: 因此,为了测试公共方法“method1”,我使用PowerMockito创建了一个spy来监视私有方法并返回一个演示列表。 上面调用private method,然后尝试调用Wr

  • 我试图使用PowerMockito在我正在测试的代码中模拟java.net.URL类的创建。基本上,我希望防止真正的HTTP请求发生,而是1)在请求发出时检查数据,2)在模拟响应中提供我自己的测试数据。这就是我正在尝试的: 我要测试的代码如下所示: 在前面的测试场景中,我模拟了wlInvokeUrlString以匹配“MyURLString”。我还尝试使用whenNew行的各种其他形式,尝试注入模

  • 问题内容: 我对Java单元测试非常陌生,听说Mockito框架对于测试非常有用。 我已经开发了一个REST Server(CRUD方法),现在我想对其进行测试,但是我不知道如何? 我什至不知道该测试程序应该如何开始。我的服务器应该在本地主机上运行,​​然后在该URL上进行调用(例如,本地主机:8888)? 这是我到目前为止尝试过的方法,但是我很确定这不是正确的方法。 这是方法的代码。 在此测试用

  • 问题内容: 我已经开始发现Mockito库,并且有一个我没有找到正确答案的问题。 例如,如果我的UserDAO类中有将用户保存到数据库中的此类方法: 我应该如何测试? 如果我想测试一个DAO类,那么我需要创建一个模拟,模拟,模拟等吗?如此不测试数据库本身? 但是,如果我还想测试dao和数据库的行为怎么办? 您能否提供一些代码示例,可能有用的链接,并显示实现此目的的最佳方法? 问题答案: 这是使用M

  • 我希望能够测试一条从队列中消耗的路由,然后在涉及spring注入服务的bean中进行一些工作,并使用mockito有效地模拟该服务。 我的Spring路线如下: emailService bean有一个自动连接的服务,然后在createEmailRequest()中调用该服务,该服务将转到另一个服务并检索用户数据以供后续使用。 测试: bean如下: 所有编译都正常,当运行路由时,队列上弹出一个对

  • 我有下面一个班的方法。 使用mockito的junit测试用例将提供100%的代码覆盖率。