Во-первых, вы не можете тестировать частные методы с JUnit / Mockito из коробки.
Во-вторых, ваше именование сбивает с толку: вы говорите «B
с getB()
» и затем вы вызываете параметр a
(для a.getB()
). B.getB()
должен возвращать C
, а не B
, так как тогда getC()
вызывается на нем. И вы говорите «C
с getC()
», а также «вложенные методы». Кроме того, D.getD()
возвращает не объект типа D
, а long
. Я адаптировал все это в соответствии с тем, что, как я думал, вы планировали. 1023 *
class C {
D getD() {
return null;
}
}
interface D {
default long getLong() {
return -1;
}
}
class E extends G {
}
class F {
G getG() {
return new E();
}
}
class G {
}
Тестируемый класс
import static java.lang.System.out;
class Clazz {
static boolean isE( final Object o ) {
return o instanceof E;
}
F f;
boolean method( final B b, final String origin ) {
out.printf( "---- %s%nb=%s%n", origin, b );
out.printf( "long=%s, original: %s%nisE=%s, original: %s%n",
b != null ? String.valueOf( b.getC().getD().getLong() ) : "<not invoked>",
( new D() {} ).getLong(),
isE( f.getG() ), Clazz.isE( new F().getG() ) );
final boolean check = b != null
&& b.getC().getD().getLong() >= 0
&& ! isE( f.getG() );
out.printf( "check=%s%n", check );
return check;
}
}
Тестовый класс
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.openMocks;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
class ClazzTest {
@InjectMocks
Clazz clazz = new Clazz();
@Mock private B b;
@Mock private C c;
@Mock private D d;
@Spy private F f;
@BeforeEach
void beforeEach() {
openMocks( this );
}
@Test
void testMocked() {
when( b.getC() ).thenReturn( c );
when( c.getD() ).thenReturn( d );
when( d.getLong() ).thenReturn( 0 );
when( f.getG() ).thenReturn( new G() );
assertTrue( clazz.method( b, "mocked" ) );
assertFalse( clazz.method( null, "mocked" ) );
}
@Test
void testOriginal() {
assertFalse( clazz.method( null, "original" ) );
assertThrows( NullPointerException.class, () -> clazz.method( new B(), "original" ) );
System.out.println( "expected <NPE thrown>" );
}
}
Выход
---- mocked
b=b
long=0, original: -1
isE=false, original: true
check=true
---- mocked
b=null
long=<not invoked>, original: -1
isE=false, original: true
check=false
---- original
b=null
long=<not invoked>, original: -1
isE=true, original: true
check=false
---- original
b=igb.so.B@8dfe921
<expected NPE thrown>