2016-02-16 7 views
0

Структуры класса являются следующие:Почему этот тест JMock терпит неудачу?

public interface Sender { 
    void send(String note); 
} 

public interface Agent { 
    void sendNote(String note); 
} 

public class Emailer implements Sender { 
    void send(String note) { 
     //...do something 
    } 
} 

public class EmailAgent implements Agent { 
    void sendNote(String note) { 
     Sender sender = new Emailer(); 
     sender.send(); 
    } 
} 

Я выполнил свою JMock/JUnit тест так:

@Rule 
public JUnitRuleMockery context = new JUnitRuleMockery(); 

Sender sender = context.mock(Sender.class); 

@Test 
public void test1() { 
    context.checking(new Expectations() {{ 
     exactly(1).of(sender).send("test"); 
    }}); 

    new EmailAgent().sendNote("test"); 
} 

По некоторым причинам, выше не удается, потому что он сказал, sender.send() никогда не вызывается. Как это возможно?

+0

Ваш 'новый EmailClient()' ничего не знает о mock 'sender'. Если вы передали его в метод, либо через конструктор, либо сам метод, он будет вести себя так, как вы этого хотите. Вместо этого вы создаете moker 'sender' в тестовом классе, а другой - в методе' test1'. –

ответ

1

EmailAgent не использует Отправителя, который он получает из любого места; он создает свои собственные. Итак:

  • Ihe test создает насмешливый отправитель (назовите его «а»).
  • Затем он вызывает sendNote, который создает второй отправитель (назовите его «b»).
  • Этот метод возвращает, и тогда тест проверяет, что «a» вызвал send - чего он не сделал, поскольку EmailClient об этом не знал.

Вместо того, чтобы создавать отправитель в EmailAgent.sendNote, вы должны создать конструктор в EmailAgent, который принимает отправитель и сохраняет его в поле экземпляра, а затем использует это поле в sendNote. Затем тест передает своего посмеянного отправителя EmailAgent.

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

  • Нет связанных вопросов^_^