2017-02-16 12 views
0

정적 및 비 정적 필드가있는 클래스가 있습니다. JUnit 테스트를 위해이 클래스를 매개 변수화한다. 이제 테스트간에 정적 필드를 공유하는지 의문의 여지가 있습니다. @Parameterized 주석이 동일한 클래스의 인스턴스를 여러 개 만드는 데 도움이된다면 정적 필드가 테스트 사이에 공유된다고 생각하지만 다른 클래스 (예 : 백그라운드에서 클래스 이름에 접미어를 추가)를 만들면 모든 클래스에 그것의 자신의 정적 필드. 나는이 코드를 테스트하기 위해 노력했지만 성공하지 : 첫째클래스를 정적화할 때 클래스를 매개 변수화 할 때 테스트간에 공유합니까?

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 

import java.util.Arrays; 
import java.util.List; 

@RunWith(Parameterized.class) 
public class Parametrized { 
    public static String field1; 
    public String field2; 
    public int slp; 

    public Parametrized (String str1, String str2, int slp) { 
    this.field1 = str1; 
    this.field2 = str2; 
    this.slp = slp; 
    } 

    @Parameterized.Parameters() 
    public static List<Object[]> data() { 
    return Arrays.asList(new Object[][] {{"1_static", "1_nonstatic", 5000}, {"2_static", "2_nonstatic", 2000}}); 
    } 

    @Test 
    public void test_static() throws InterruptedException { 
    System.out.println(field1); 
    Thread.sleep(this.slp); 
    System.out.println(field2); 
    System.out.println(field1); 
    } 
} 

, 나는 테스트가 병렬로 실행되지 않는 것으로 나타났습니다 만, 연이어 : 나는 그 @Parameterized을 사용하는 주요 포인트라고 생각 - 테스트를 병렬로 실행합니다.

둘째로, 정적 필드가 공유되는지 여부를 찾는 데 도움이되지 못해 하나씩 실행되기 때문에.

+0

Maven의 SureFire 플러그인을 사용하여 테스트를 실행하면 어떻게 작동하는지도 명확하지 않습니다. 정적 인 객체를 각각 가지고있는 백그라운드에서 매개 변수화 된 클래스의 다른 복사본을 생성합니까? – user6419217

답변

2

주석을 추가해도 Java 작동 방식은 변경되지 않습니다. static 필드는 여전히 정적 필드입니다.

이것은 서로 간섭 할 수 있으므로 테스트를 병렬로 실행하는 경우가 아닙니다. 예 : 정적 필드와 같은 공유 리소스.

현재 생성자에서 정적 필드를 설정하는 경우 거의 확실하게 잘못된 작업을 수행하고 있습니다.

+0

생성자에서 정적 필드를 설정하는 것에 대해 - 정적 필드가 공유되는지 테스트하기 위해이를 수행했습니다. 그래서 잠을 잤습니다. 첫 번째 데이터로 설정하고 두 번째 데이터 집합으로 변경 한 다음 첫 번째 데이터 집합에서 값을 확인하여 두 번째 집합에서 변경되었는지 확인하려고했습니다. 데이터. 그러나 병렬 적으로 실행되지 않았지만 순차적으로 실행 되었기 때문에 많은 의미가 없습니다. 그래서 내가 무슨 일이 일어나고 있는지 명확히하기 위해 이곳에 왔습니다. – user6419217

+0

@ user6419217 정적 필드는 여전히 정적입니다. 테스트마다 변경되지 않는 필드에만 사용해야하므로 중요하지 않습니다. 테스트 간의 간섭은 디버깅하는 데 큰 고통입니다. –