Ich benutze Mockito, um Frühlingsbohnen zu verspotten.Mock Spring Komponente
Es funktioniert gut, wenn ich eine Schnittstelle vortäusche.
In unserer Anwendung gibt es nur wenige @Component-Beans, die keine Schnittstelle implementieren.
Wenn ich versuche, solche Komponente zu verspotten, versucht der Spring-Kontext, die Eigenschaften in diesen Komponenten zu injizieren.
Unterstützt Mockito keine spöttischen Federkomponenten, die keine Schnittstelle implementieren?
Befestigt Beispiel als
angefordertpublic interface EmployeeInterface {
public Long saveEmployee(Employee employee);
}
@Component
public class EmployeeImpl implements EmployeeInterface {
@Autowired
public EmailSender emailSender
public Long saveEmployee(Employee employee) {
...
}
}
public interface EmailSender {
public boolean sendEmail(Email email);
}
@Component
public class EmailSenderImpl implements EmailSender {
@Autowired
MailServerInfo MailServerInfo;
public boolean sendEmail(Email email) {
...
}
}
public interface MailServerInfo {
public String getMailServerDetails();
}
@Component
public class MailServerInfoImpl {
public String getMailServerDetails() {
...
}
}
@Profile("Security-test")
@Configuration
public class SecurityTestMockConfiguration {
@Bean
@Primary
public EmailSender emailSender() {
return Mockito.mock(EmailSender.class);
}
}
@ActiveProfiles("Security-test")
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context-test.xml" })
public class MyTest {
@Autowired
EmployeeInterface employeeInterface;
@Test
public void testSaveEmployee() {
employeeInterface.saveEmployee(employee);
}
}
Im obigen Beispiel, wenn ich EmailSender mit Mockito verspotten funktioniert es völlig in Ordnung.
Im folgenden Szenario ist EmailSender eine Spring-Komponente, die keine Schnittstelle implementiert. Im folgenden Fall erhalte ich einen Fehler während der automatischen Verdrahtung.
public interface EmployeeInterface {
public Long saveEmployee(Employee employee);
}
@Component
public class EmployeeImpl implements EmployeeInterface {
@Autowired
public EmailSender emailSender
public Long saveEmployee(Employee employee) {
...
}
}
@Component
public class EmailSender {
@Autowired
MailServerInfo MailServerInfo;
public boolean sendEmail(Email email) {
...
}
}
public interface MailServerInfo {
public String getMailServerDetails();
}
@Component
public class MailServerInfoImpl {
public String getMailServerDetails() {
...
}
}
@Profile("Security-test")
@Configuration
public class SecurityTestMockConfiguration {
@Bean
@Primary
public EmailSender emailSender() {
return Mockito.mock(EmailSender.class);
}
}
@ActiveProfiles("Security-test")
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:context-test.xml" })
public class MyTest {
@Autowired
EmployeeInterface employeeInterface;
@Test
public void testSaveEmployee() {
employeeInterface.saveEmployee(employee);
}
}
Im zweiten Szenario schlägt die autowiring weil EmailSender nicht MailServerInfo Implementierung finden konnten.
Bitte fügen Sie Ihre Testklasse an –
Angeschlossen die Testklasse – lives
Bitte geben Sie context-test.xml an. –