我在本地使用@InjectMocks注入依賴時發現@InjectMocks並不能將“被注入類”中所有“被Mook的類”都用“Mook的類”的替換掉,注入的方式似乎沒有規則,目前測試結果如下:
@InjectMocks只會注入給一個成員變量,只注入一次。
優先級從大到小:沒有創建對象的成員變量(無論申明在哪里,但只能有一個,超過一個會空指針) > 創建對象的成員變量(在申明時就創建對象)
https://akcasoy.wordpress.com/2015/02/13/when-to-use-mockito-spy/
https://stackoverflow.com/questions/56940679/mockito-cant-inject-mocks
Here is a no answer. I could not give more because I am really sorry to see so many people use this awkward API relying on reflection while you could do things really clear for the readers of the class by explicitly setting the dependency.
The thing is, my test throws no exceptions, but it doesn't inject my mock object
Not surprising. This way of injecting the mock stays quiet even if no injection succeeds. From the InjectMocks
javadoc (emphasis is not mine!) :
Mockito will try to inject mocks only either by constructor injection, setter injection, or property injection in order and as described below. If any of the following strategy fail, then Mockito won't report failure; i.e. you will have to provide dependencies yourself.
While Mockito does not report failure, I really discourage to use this API.
About your actual issue, look at that :
@Autowired @InjectMocks private IREjercicioDAO rEjercicioDAO;
You annotate the field with both Spring and Mockito annotation. Do you feel confortable with the order of their processing ? These come from two distinct libraries. I don't tell that it will never work (luck and random exists) but do you really think that it is robust ?
To achieve your requirement you could write something like that that does things in two explicit steps :
- objects instantiation : mocking the dependency and inject the spring dependency
- relationship set : between the mock dependency and the spring dependency
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION) public class REjercicioDAOTest extends ATest { @Mock private ICustomFileHandler customFileHandler; @Autowired private IREjercicioDAO rEjercicioDAO; @Before public void before () { MockitoAnnotations.initMocks(this); // Set explicitly the fileHandler dependency rEjercicioDAO.setFileHandler(customFileHandler); } }