12

Spring フレームワーク内の他のサービス内に挿入されたサービスをモックする問題に直面しています。これが私のコードです:

@Service("productService")
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ClientService clientService;

    public void doSomething(Long clientId) {
        Client client = clientService.getById(clientId);
        // do something
    }
}

ClientServiceテスト内をモックしたいので、次のことを試しました。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/spring-config.xml" })
public class ProductServiceTest {

    @Autowired
    private ProductService productService;

    @Mock
    private ClientService clientService;

    @Test
    public void testDoSomething() throws Exception {
        when(clientService.getById(anyLong()))
                .thenReturn(this.generateClient());

        /* when I call this method, I want the clientService
         * inside productService to be the mock that one I mocked
         * in this test, but instead, it is injecting the Spring 
         * proxy version of clientService, not my mock.. :(
         */
        productService.doSomething(new Long(1));
    }

    @Before
    public void beforeTests() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    private Client generateClient() {
        Client client = new Client();
        client.setName("Foo");
        return client;
    }
}

clientService中身はproductServiceSpringプロキシ版で、欲しいモックではありません。Mockito でやりたいことはできますか?

4

4 に答える 4

6

ProductService次の注釈を付ける必要があります@InjectMocks

@Autowired
@InjectMocks
private ProductService productService;

これにより、ClientServiceモックが に挿入されますProductService

于 2013-09-25T11:57:42.587 に答える
1

これを達成する方法は他にもありますが、これを行う最も簡単な方法は次のdon't use field injection, but setter injectionとおりです。

@Autowired
public void setClientService(ClientService clientService){...}

あなたのサービスクラスで、あなたのモックをテストクラスのサービスに注入することができます:

@Before
public void setUp() throws Exception {
    productService.setClientService(mock);
}

important:これが単体テストのみの場合は、フィールドにフィールド注入を使用できるようにSpringJUnit4ClassRunner.class、 , butを使用しないことを検討してください。MockitoJunitRunner.class

于 2013-09-25T11:57:13.357 に答える