2017-04-11 3 views
0

私はJunitテストを数週間行っています。私の経験は、ジュニアプログラマであるため、かなり限られています。プロジェクトのより簡単なサービスクラスをテストした後、今は頑張っています。私がテストしてい
Junit:私の@Autowiredフィールドでのサービスのテスト

@RunWith(SpringRunner.class) 
public class SomeServiceTest { 
    @Mock 
    private SomeRepository someRepository; 
    @InjectMocks 
    private SomeService someService; 

    @Test 
    public void testMyFunc() { 
     SomeOtherDto param = new SomeOtherDto(); 
     param.setVar1(...); 
     param.setVar2(...); 
     Mockito.when(someRepository.getIt()).thenReturn(-1L); 
     Mockito.when(someService.myPrivBoolBuilder(param,-1L))                      
              .thenReturn(new BooleanBuilder()); 
     Pageable pageable = null; 
     Page<SomeDto> result = someService.myFunc(param, pageable); 
     assertEquals(expResult, 
    } 
    /* ... */ 
} 

とサービス::

@Service 
@Transactional 
public class SomeService implements someAbstractService { 
    private final CustomMapper customMapper 
    private final SomeRepository someRepository; 
    private final SomeOtherRepository someOtherRepository; 

    @Autowired 
    public SomeService(final CustomMapper customMapper, final SomeRepository someRepository, 
         final SomeOtherRepository someOtherRepository, etc) 
    { /* ... */ } 

    public Page<SomeDto> myFunc(final SomeOtherDto param, final Pageable pageable) { 
     final BooleanBuilder predicate = myPrivBoolBuilder(param, 
              someOtherRepository.getId()); 
     return someRepository.findAll(predicare, pageable).map(obj -> { 
              return customMapper.map(obj) }); 
    } 

    public BooleanBuilder myPrivBoolBuilder(final SomeOtherDto param, final Long id) { 
     BooleanBuilder predicate = new BooleanBuilder(); 
     final QSomeRepository qSomeRepository = QSomeRepository.someRepository; 
     final QSomeOtherRepository qSomeOtherRepository = QSomeOtherRepository.someOtherRepository(); 
     predicate.and(qSomeRepository.someField.someOtherField.goe(param.getX())); 
     predicate.and(qSomeRepository.someField2.someOtherField2.isNotNull())); 
     predicate.and(qSomeOtherRepository.someField.someOtherField.id.eq(id() 
      .or(qSomeOtherRepository.someField.someOtherField.id.in(...)))); 
     return predicate;   
    } 
    /* ... */  
} 


問題は、私は、私はつまり、テストしていたサービスクラスのコンストラクタにいくつかのprivate final someRepositoryを注入することができないということです私の問題は、私がテストを実行するとsomeOtherRepository.getId()nullSpringRunner.classと返すことです。私はMockitoJUnitRunner.classで実行するとsomeServiceコンストラクタは、コンストラクタエラースロー:someRepository is NULL
私は複数の方法を試してみました(、Mockito().doReturn...構文、@MockBean@Spyなどを試してみましたが)、これらは私が手に2つのエラーです。私はそれがMockingフレームワークを正しく使うことの問題だと確信しています。
他のスニペットや詳細が必要な場合は、お気軽にご提供します。

答えて

1

理由は、@InjectMocksアノテーションのためにMockitoがオブジェクトを作成しようとしているからです。

SpringRunnerは、これがスプリングテストではないため、必要ありません。特別ランナーが本当に必要な場合は、MockitoJUnitRunnerに行くことができます。

BeforeメソッドでMockitoアノテーションを初期化してから、モックされた依存関係を提供するコンストラクタを使用してサービスインスタンスを作成することができます。

public class SomeServiceTest { 
    @Mock 
    private SomeRepository someRepository; 

    private SomeService someService; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     someService = new SomeService(someRepository); 
    } 

    /* ... */ 
} 
+0

私が試してみましたが、今の問題は、この行です: 'Mockito.when(someService.myPrivBoolBuilder(パラメータ、-1L)) .thenReturn(新BooleanBuilder());' ランタイムエラーが 'ですwhen()には、 '模擬メソッド呼び出し'でなければならない引数が必要です。 –

+0

実際のオブジェクト(someService)でメソッド呼び出しをモックしようとしています。 someRepositoryをモックする必要があります。 – galovics

+0

あなたは正しいです。 私はその関数呼び出しを模擬することができるメソッド( '@ Spy'のようなものですが、その厄介な' SomeRepository'も挿入する)がありますか? –

-1

Springが提供するReflectionTestUtilを使用して、テストクラスからSomeRepositoryのモックを注入できます。

; ReflectionTestUtils.setField(someService, "someRepository", mock(SomeRepository.class));

関連する問題