어떤 클래스의 private 접근 제한자가 아닌 모든 함수를 Mocking 하는 것은 피해야 합니다.

 

만약 테스트를 작성하기 위해 어떤 클래스의 private 제한자가 아닌 모든 함수를 Mocking 했다면, 그것은 테스트가 너무 복잡해졌거나 Mocking 작동 방식을 잘못 이해했다는 것입니다. 테스트 코드를 여러 유닛으로 리팩터링 하거나 직접 인스턴스화 하여 클래스 자체를 사용하는 것을 고려해야 합니다. 또는 테스트하고자 하는 클래스를 상속하는 클래스를 새로 만들어 사용하는 것을 고려해야 합니다.

이 룰은 주어진 클래스의 모든 멤버를 mocking 한 경우 알려줍니다.

규칙을 어긴 코드

@Test
void test_requiring_MyClass() {
    MyClass myClassMock = mock(MyClass.class); // 규칙을 어긴 코드
    when(myClassMock.f()).thenReturn(1);
    when(myClassMock.g()).thenReturn(2);
    //...
}

abstract class MyClass {
    abstract int f();
    abstract int g();
}

규칙을 준수한 해결책

@Test
void test_requiring_MyClass() {
    MyClass myClass = new MyClassForTest();
    //...
}

class MyClassForTest extends MyClass {
    @Override
    int f() {
        return 1;
    }

    @Override
    int g() {
        return 2;
    }
}

규칙을 준수한 해결책

@Test
void test_requiring_f() {
    MyClass myClassMock = mock(MyClass.class);
    when(myClassMock.f()).thenReturn(1);
    //...
}

@Test
void test_requiring_g() {
    MyClass myClassMock = mock(MyClass.class);
    when(myClassMock.g()).thenReturn(2);
    //...
}

abstract class MyClass {
    abstract int f();
    abstract int g();
}

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project