2

我正在使用 JUnit 4 和 MockMvc 测试 REST 控制器。当我几周前编写测试时,一切都按预期工作。我对代码进行了一些修改,但没有更改 JUnit 测试。现在,当我尝试运行测试时,出现错误:

Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/application.properties]

这是我的代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyServerApplication.class)
@SpringBootTest
@Transactional
public class MovieControllerTest {

    private MockMvc mockMvc;

    @Autowired
    private MovieRepository movieRepository;

    @Autowired
    private WebApplicationContext wac;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    // Some tests
}

我的主要课程:

@SpringBootApplication
public class MyServerApplication{

    public static void main(String[] args) {
        SpringApplication.run(MyServerApplication.class, args);
    }
}

我的application.properties文件位于src/main/resources. 我没有移动这个文件,我什么也没做,只是在我的服务中添加了一些代码并在我的文件中添加了一些属性。

我阅读了 SO questions & doc,并尝试了以下解决方案:

  • 检查它src/main/resources是否仍在我的测试类路径中
  • @PropertySource("classpath:application.properties")在我的测试中的注释下添加;它没有用,所以我尝试src/test/resources用里面的副本创建一个application.properties,如一篇帖子中所建议的那样
  • 添加@PropertySource("classpath:application.properties")主类而不是测试类
  • 添加@WebAppConfiguration注释
  • 添加@WebMvcTest注释

当然,我没有同时尝试所有这些解决方案,每次失败后我都删除了添加的代码。

我仍然可以毫无问题地运行我的代码,只有测试类导致FileNotFoundException.

如何解决这个问题?为什么我的测试类有问题,但运行服务器时一切正常?

4

1 回答 1

1
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyServerApplication.class)
@SpringBootTest
@Transactional
public class MovieControllerTest { ... }

这就是你在测试课上的内容。使用时@SpringBootTest您不应该使用@ContextConfiguration(请参阅Spring Boot 参考指南的测试章节)。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@Transactional
public class MovieControllerTest { ... }

我还建议您使用 Spring Boot 进行测试,而不是尝试手动执行操作。对于模拟 mvc 测试 Spring Boot 应用程序,已经为您完成了特殊的切片和设置。

要启用此功能,请添加@AutoConfigureMockMvc到您的测试中并投入@Autowired使用MockMvc(并删除您@Before方法中的设置)。

于 2017-05-12T10:25:28.283 回答