>source

추상 클래스의 메서드에서 단위 테스트를 실행하려고합니다. 아래 code를 요약했습니다.

초록 수업 :

public abstract class TestAb
{
    public void Print()
    {
        Console.WriteLine("method has been called");
    }
}

테스트 :

[Test]
void Test()
{
    var mock= new Mock<TestAb>();
    mock.CallBase= true;
    var ta= mock.Object;
    ta.Print();
    mock.Verify(m=> m.Print());
}

메시지 :

Method is not public

여기서 내가 뭘 잘못하고 있니? 제 목표는 Moq 프레임 워크를 사용하여 추상 클래스 내부의 메서드를 테스트하는 것입니다.

  • 답변 # 1

    메시지는 테스트 방법이 공개되지 않았기 때문입니다. 테스트 방법은 공개되어야합니다. 테스트 방법을 공개 한 후에도 추상 /가상 방법 만 확인할 수 있으므로 실패합니다. 따라서 귀하의 경우에는 구현이 있으므로 가상 메서드를 만들어야합니다.

  • 답변 # 2

    대답비슷한 질문에 대해 :

    해결 방법으로 메서드 자체가 아닌 가상 래퍼 메서드를 대신 만들 수 있습니다.

    public abstract class TestAb
    {
        protected virtual void PrintReal(){
                Console.WriteLine("method has been called");
        }
        public void Print()
        {
            PrintReal();
        }
    }
    

    그런 다음 테스트 클래스에서 재정의합니다.

    abstract class TestAbDelegate: TestAb{
         public abstract override  bool PrintReal();
    }
    

    테스트 :

    [Test]
    void Test()
    {
        var mock= new Mock<TestAbDelegate>();
        mock.CallBase= true;
       mock.Setup(db=> db.PrintReal());
        var ta= mock.Object;
        ta.Print();
        mock.Verify(m=> m.PrintReal());
    }
    

  • 답변 # 3

    이러한 추상 클래스에서 메소드를 모의하려면 가상 또는 추상으로 만들어야합니다.

  • 이전 java : 개체가 null 인 경우 if 문을 입력 할 수 없습니다.
  • 다음 ionic4 : ionic 4에서 다시 탐색 할 때 이온 슬라이드가 작동하지 않습니다.