我正在使用 Mockito 3.1.0 和 Junit 5.5.2 運行一個基本的 Spring 應用程式。我有一個 Service 呼叫,其中包含兩個 Spring Data JPA 存盤庫。這些被傳遞到 DI 的建構式中(以及另外兩個無關緊要的 - 我將它們包括在內,以防它們也可能導致錯誤。)當應用程式運行時,我認為服務沒有問題。
當我運行我的測驗時,我得到了一個 NPE myService。單步執行堆疊跟蹤,并沒有真正向我展示與錯誤相關的任何內容。我也嘗試過(按照這篇文章:https : //www.baeldung.com/mockito-junit-5-extension)更新我的測驗類,如下所示:
@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class) // This dependency doesn't seem to exist
public class MyServiceTest {
// ...
@BeforeEach
// not the JUnit4 @Before annotation.
// Interestingly, this gives me NPEs for the repositories, not the service.
public void setup(){
// ...
}
}
無濟于事。我懷疑正在發生的事情是我的設定沒有正確連接 - 無論是作為 DI 的依賴項還是語法。
我該如何除錯?我錯過了什么?提前致謝!
服務:
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final Repository1 repository1;
private final Repository2 repository2;
private final Repository3 repository3;
private final Repository4 repository4;
public MyService(Repository1 repository1,
Repository2 repository2,
Repository3 repository3,
Repository4 repository4) {
this.repository1 = repository1;
this.repository2 = repository2;
this.repository3 = repository3;
this.repository4 = repository4;
}
public Boolean computeValue(String someInput) {
// does computations with repository1, repository2.
}
}
測驗:
import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
@Mock
private Repository1 repository1;
@Mock
private Repository2 repository2;
@Mock
private Repository3 repository3;
@Mock
private Repository4 repository4;
@InjectMocks
private MyService myService;
@Before
public void setup {
when(repository1.findAll()).thenReturn(new ArrayList<>());
when(repository1.findAllByInput(anyString())).thenReturn(new ArrayList<>());
// Yes; I'm aware that this could also be a call to
// MockitoAnnotations.initMocks(this). I've tried it:
// it doesn't work. Also, I've intentionally not taken this
// approach due to reasons:
// - https://stackoverflow.com/questions/10806345/runwithmockitojunitrunner-class-vs-mockitoannotations-initmocksthis
}
@Test
void callMyService() {
assertTrue(myService.computeValue("123"));
}
}
示例存盤庫:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
// This is just an example, but this pattern is repeated against all
// repositories in the project.
@Repository
public interface Repository1 extends JpaRepository<Repository1, String> {
}
編輯:
- 我忘了提,我在這個專案中其他檔案正在使用正是這些注釋(
@RunWith(MockitoJUnitRunner.class),@Mock,@InjectMocks,@Before)未失敗。 - 我用相關的匯入更新了檔案,并添加了一個
RepositoryN. - 我更新了
MyService類以更好地反映引數。
uj5u.com熱心網友回復:
對于將來遇到此問題的任何其他人,我們能夠通過更改以下匯入之一來解決此問題:
import org.junit.jupiter.api.Test;
到
import org.junit.Test;
uj5u.com熱心網友回復:
看起來你的物件myService沒有被實體化。我建議不要使用@InjectMocks并直接創建您的物件,因為您的存盤庫已經實體化。
MyService myService = new MyService(..., ..., ...)
uj5u.com熱心網友回復:
我想你必須用@ExtendWith(SpringExtension.class)而不是用MockitoExtension.class
更多資訊請參見帶有 Spring Boot 的 Junit 5:何時使用 @ExtendWith Spring 或 Mockito?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349034.html
上一篇:使用SpringOAuth2資源服務器和對稱密鑰時如何避免KeyLengthException
下一篇:使用url發送多個變數
