Модульное тестирование Spring throws BeanNotOfRequiredTypeException - PullRequest
0 голосов
/ 16 ноября 2018

При запуске тестового класса выдается следующее исключение:

BeanNotOfRequiredTypeException: Bean named 'myServiceImpl' is expected to be of type 'MyServiceImpl' but was actually of type 'com.sun.proxy.$Proxy139'

Эта ошибка вызывается только при модульных тестах, сама программа работает.

Мой интерфейс

public interface MyService {

    public String testMethod();

}

Моя реализация

@Service
public class MyServiceImpl implements MyService{

    @Autowired
    private TransactionRepository transactionRepo;

    @Autowired
    private AccountRepository accountRepository;

    @Autowired
    private BankAccountStatementFactory baStatementFactory;

    public String myMethod() {
        return "Run My Method";
    }

}

Мой модульный тест

@RunWith(SpringRunner.class)
@SpringBootTest
public class DeleteMeTest{


    @Mock
    private TransactionRepository transactionRepo;

    @Mock
    private AccountRepository accountRepository;

    @Mock
    private BankAccountStatementFactory baStatementFactory;

    @InjectMocks
    @Resource
    MyServiceImpl myService;


    @org.junit.Before
    public void setUp() throws Exception {
        // Initialize mocks created above
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {
        myService.myMethod();
        System.out.println("My Unit Test");
    }

}

При запуске этого класса теста выбрасывается следующееисключение:

BeanNotOfRequiredTypeException: Bean named 'myServiceImpl' is expected to be of type 'MyServiceImpl' but was actually of type 'com.sun.proxy.$Proxy139'

Решение здесь состоит в том, чтобы ввести интерфейс, а не реализацию в модульный тест, но это не позволит мне вводить макеты.

Это потому, что требуется реализация с аннотацией @InjectMocks.Когда я пытаюсь внедрить макеты в интерфейс, я получаю следующее исключение:

Cannot instantiate @InjectMocks field named 'myService'! Cause: the type 'MyService' is an interface.

Просто чтобы прояснить, все это сработало в начале и пошло плохо, когда я переупаковал свои классы.Это может быть причиной, но не уверен на 100%.

Любые намеки на то, что может вызвать это BeanNotOfRequiredTypeException?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Если вам действительно нужно использовать Spring (причина использования Spring в модульном тесте неясна из вашего поста), вы можете попытаться разархивировать bean-компонент:

Иметьотдельное объявление для прокси и бина:

@Resource
MyServiceImpl proxy;

@InjectMocks
MyServiceImpl myService;

Затем инициализируйте их в setUp():

@org.junit.Before
public void setUp() throws Exception {
    // Initialize mocks created above
    myService = (MyServiceImpl)((TargetSource) proxy).getTarget();
    MockitoAnnotations.initMocks(this);

}
0 голосов
/ 16 ноября 2018

Поскольку это юнит-тест, вам не нужен Spring ИМХО.

Просто инициализируйте тестируемый класс следующим образом:

@InjectMocks
MyServiceImpl myService = new MyServiceImpl();

Вы также можете удалитьэти аннотации:

@RunWith(SpringRunner.class)
@SpringBootTest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...