2017-10-08 21 views
0

일부 환경 조건 (예 : 특정 위치에 파일이 있는지 여부)에 따라 소프트웨어가 다르게 작동해야하는 경우가 있습니다.파일 존재 여부에 따라 다른 동작을하는 단위 테스트

내 경우에는 라이브러리를 개발 중이며 classpath의 구성 파일에 따라 구성됩니다 (구성 파일이없는 경우 기본 동작으로 되돌아갑니다).

이 수업을 어떻게 단위 테스트해야합니까?

파일이 클래스 경로에 존재하지 않는
  • 을 내용으로 파일을 클래스 패스
  • 에 존재
      콘텐츠 B를 사용하여 파일을 클래스 패스에 존재 : 나는 다음과 같은 경우에는 클래스를 평가하기위한 테스트를 작성해야

    하지만 환경을 구성하는 방법을 모르겠다. 그리고 테스트를 하나씩 실행하십시오.

    필자는 자바를 사용하고 있으며 테스트 클래스 경로에 JUnit과 TestNG를 둘 다 가지고 있습니다.


    편집 : 문제 중 하나는 설정 파일이 클래스 경로에있는, 그래서 있다는 것입니다 일반 클래스 로더 발견로드는, 그것은 한 같은 클래스 로더를 사용하면서 동일한 콘텐츠를 반환하는 경우. 그리고 테스트를 위해 사용자 정의 ClassLoader를 사용하는 것이 매우 복잡하므로 테스트를 검증하는 테스트가 필요하다고 생각합니다!

  • +1

    우리의 [SO 질문 체크리스트]를 검토하십시오 (http://meta.stackoverflow.com/questions/260648/stack- overflow-question-checklist)를 사용하면 좋은 질문을하고 좋은 대답을 얻을 수 있습니다. –

    +0

    단위 테스트에서 환경 (파일 시스템, env 변수, 네트워크, 시간/날짜, 데이터베이스)을 유지하십시오. 아프다. 모든 것을 조롱해라. – Robert

    +0

    @ 로버트 그걸 원하고 싶지만 생산 환경은 어떨까요? 대상 배포에서 classpath 파일의 존재 여부를 확인해야합니다. 테스트에서도 동작이 필요하지 않습니까? –

    답변

    1

    테스트로 만든 임시 파일을 사용하여 클래스의 경로를 조롱 할 수 있습니다.

    ConfigurationTest.java :

    import static org.hamcrest.Matchers.*; 
    import static org.junit.Assert.*; 
    import static org.junit.Assume.assumeThat; 
    
    import java.nio.file.Files; 
    import org.junit.Test; 
    
    public class ConfigurationTest { 
    
        private Configuration config = new Configuration(); 
    
        @Test 
        public void testWithConfigFile() throws Exception { 
         config.configFile = Files.createTempFile("config_",".ini"); 
         config.configFile.toFile().deleteOnExit(); 
         assertFalse(config.isInDefaultMode()); 
        } 
        @Test 
        public void testWithoutConfigFile() throws Exception { 
         assumeThat(Files.exists(config.configFile), is(false)); 
         assertTrue(config.isInDefaultMode()); 
        } 
    } 
    

    Configuration.java :

    import java.nio.file.Files; 
    import java.nio.file.Path; 
    import java.nio.file.Paths; 
    
    public class Configuration { 
    
        Path configFile = Paths.get("config.ini"); 
    
        public boolean isInDefaultMode() { 
         return !Files.exists(configFile); 
        } 
    }