我正在使用 spring-boot-1.5 。在单元测试期间,是否可以在 src / test / resources 中加载 application.properties ?我知道如何使用集成测试来加载它,我们可以使用 @SpringBootTest 或 @ContextConfiguration ,但是我想在单元测试期间使用application.properties。
让我解释一下我的情况,
@SpringBootApplication(exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class })
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
public class BookBackendApplication {
public static void main(String[] args) {
SpringApplication.run(BookBackendApplication.class, args);
}
}
@Service
public class BookService {
@Value("${book-list:ACTIVE}")
private List<String> bookList = new ArrayList<>();
@Value("${book-status:PURCHASING}")
private String bookStatus;
public BookResponse purchaseBook(BookRequest bookRequest) {
if(bookRequest.getStatus().equals(bookStatus)) { //Here getting NPE while executing unit test
....
}
}
}
单元测试
@RunWith(SpringRunner.class)
public class BookServiceTest {
@InjectMocks
private BookService bookService;
@Test
public void testBookActivate() throws IOException {
BookResponse bookResponse = bookService.purchaseBook(bookRequest);
...
}
}
在运行此单元测试时未加载属性,因此在BookService.java中获得了NPE。运行单元测试时,有什么方法可以加载src / test / resource / application.properties吗?
任何指针或帮助都是非常有意义的。
答案 0 :(得分:0)
您可以使用@TestPropertySource
查看此页面:override-default-spring-boot-application-properties-settings-in-junit-test
答案 1 :(得分:0)
最后,我得到了答案。我使用下面的代码在运行模拟时设置静态字段。 ReflectionTestUtils 解决了该问题。
@RunWith(SpringRunner.class)
public class BookServiceTest {
@InjectMocks
private BookService bookService;
@Before
public void setup() {
ReflectionTestUtils.setField(bookService, "bookStatus", "PURCHASING");
ReflectionTestUtils.setField(bookService, "bookList", Arrays.asList("ACTIVE","ACTIVATING"));
}
@Test
public void testBookActivate() throws IOException {
BookResponse bookResponse = bookService.purchaseBook(bookRequest);
...
}
}
非常感谢支持人员。让我们继续帮助别人。