2017-09-27 1 views
2

Ich habe eine Spring Boot-Webanwendung mit Spring Initializr generiert, die eingebettete Tomcat + Thymeleaf-Vorlagen-Engine verwendet und als ausführbare JAR-Datei gepackt hat.Junit/Spring Boot Mocking-Klassen

verwendet Technologies:

Frühling Stiefel 1.4.2.RELEASE, Frühling 4.3.4.RELEASE, Thymeleaf 2.1.5.RELEASE, Tomcat Embed 8.5.6, Maven 3, Java 8

Ich habe diese Klasse ich habe diese jUnit-Testklasse:

@ContextConfiguration(classes={TestPersistenceConfig.class}) 
@RunWith(SpringRunner.class) 
@SpringBootTest 
public class JdbcRemoteUnitRepositoryTests { 

    @Autowired 
    private JdbcRemoteUnitRepository repository; 

    @Autowired 
    @InjectMocks 
    private SmsConfig smsConfig; 

    @Autowired 
    @InjectMocks 
    private NextelSMSSender smsService; 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testGetAllUnits() throws DataAccessException, SQLException {   
     Assert.assertTrue(true); 
    } 

} 

die Klasse NextelSMSSender:

@Service("smsService") 
public class NextelSMSSender { 

    public final static String OK_STATUS_CODE = "200"; 

    @Autowired 
    SmsConfig smsConfig; 
.. 
} 

.

Aber es scheint, dass nicht die Objekte Eigenschaft verspotten, weil, wenn ich die App verpacke. Ich habe diesen Fehler:

*************************** 
APPLICATION FAILED TO START 
*************************** 

Description: 

Field smsConfig in com.plats.bruts.NextelSMSSender required a bean of type 'com.plats.bruts.config.SmsConfig' that could not be found. 

Action: 

Consider defining a bean of type 'com.plats.bruts.config.SmsConfig' in your configuration. 

ich ein Mock-Bean erstellt TestSmsConfig genannt, versucht @Bean hinzuzufügen, aber ich habe einen Kompilierungsfehler:

The annotation @Bean is disallowed for this 
location 

    @Configuration 
    @Bean 
    public class TestSmsConfig { 

     @Value("fake.domainId") 
     private String domainId; 

     @Value("fake.sms.gateway.url") 
     private String gatewayUrl; 

     ... 
} 

Antwort

1

Sie autowiring smsconfig, aber Sie werden nicht angezeigt um @Bean in Ihrem Testanwendungskontext bereitzustellen.

Außerdem verwenden Sie @InjectMocks falsch - dies sollte verwendet werden, um Mock-Objekte in die getestete Klasse zu injizieren (Ihre NextelSMSSender-Klasse, nicht SmsConfig).

Um dies zu beheben, fügen Sie in Ihrer Konfigurationsklasse eine @Bean-Methode hinzu, um SmsConfig-Bean-Instanzen bereitzustellen.

Ersetzen Sie @InjectMocks von der SmsConfig-Variable in Ihrer Testklasse mit @MockBean. SmsConfig ist ein automatisches Mock-Objekt und nicht die zu testende Klasse.

Siehe Abschnitt 41.3.4 - Von den Spring Boot Testing Features für weitere Informationen:

Spring Boot includes a @MockBean annotation that can be used to define a Mockito mock for a bean inside your ApplicationContext. You can use the annotation to add new beans, or replace a single existing bean definition. The annotation can be used directly on test classes, on fields within your test, or on @Configuration classes and fields. When used on a field, the instance of the created mock will also be injected. Mock beans are automatically reset after each test method.

0

OK, so ist dies Ihre Konfiguration:

@Configuration 
    @PropertySource("sms-gateway.properties") 
    public class SmsConfig { 

    @Value("${sms.domainId}") 
    private String domainId; 

    @Value("${sms.gateway.url}") 
    private String gatewayUrl; 
.. 
} 

Wenn Sie diese Konfiguration in Ihrem Test verwenden möchten, Sie sollten es auf Ihre Konfigurationsklassen hinzufügen ...

@ContextConfiguration(classes={TestPersistenceConfig.class, SmsConfig.class}) 

Und nicht fügen Sie es als @Autowired o Was auch immer.