2016-10-07 4 views
0

У меня есть класс, который должен быть протестировано:Как проверить методы с Mockito/Powermockito

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, но не с обоими. Как мне высмеять объекты и как я могу успешно запустить тестовый пример?

Я новичок в модульном тестировании и пытался получить помощь от различных сообществ, но не нашел соответствующего ответа. Любая помощь будет оценена по достоинству. Благодаря!

+0

Инициализировать свои фиктивные объекты в методе @Before –

+0

Вы не можете использовать 'connection' вне конструктора? Действительно ли 'TCP' и' COLON' связаны с доменом 'AMQProducer'? – Spotted

ответ

0

Вы не можете протестировать его с текущей структурой вашего кода - вы создаете 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 
    } 

} 
Смежные вопросы