如何在 power mockito 中模拟生成的对象及其属性

How to mock generated object and its attribute in power mockito

我正在创建一个具有配置(下面的代码)的适配器 Web 服务。 我可以模拟 'app' 对象,但它的属性 'datasource' 是空的,即使我嘲笑了它。如何模拟数据源及其连接属性?

MyAdapter.java

public class MyAdapter {

 @Context
 private ConfigurationAPI configApi;

 @Context
 private AdaptersAPI adaptersAPI;

 public Connection getSQLConnection() throws SQLException {

    JavaAdapter app = adaptersAPI.getJaxRsApplication(JavaAdapter.class);
    return app.getDataSource().getConnection();
   }
}

MyAdapterTest.java

     @RunWith(PowerMockRunner.class);
     public class MyAdapterTest {

         @Mock
         DataSource dataSource;

         @Mock
         private ConfigurationAPI configApi;

         @Mock
         private AdaptersAPI adaptersAPI;

         @InjectMocks
         MyJavaAdapter myAdapter;

         private MyApp app = new MyApp();

         @Test
         public void getSQLConnectionTest() throws SQLException {

     PowerMockito.when(adaptersAPI.getJaxRsApplication(JavaAdapter.class).thenReturn(app);
     PowerMockito.when(app.getDataSource()).thenReturn(dataSource);
           }
        }

MyApp.java

 public class MyApp extends MFPJAXRSApplication{


    private DataSource dataSource = null;

    @Override
    protected void init() throws Exception {

        InitialContext ctx = new InitialContext();
        dataSource = (DataSource) ctx.lookup("customPath");
    }

    @Override
    protected void destroy() throws Exception {

    }

    @Override
    protected String getPackageToScan() {
        return getClass().getPackage().getName();
    }

    public DataSource getDataSource() {
        return dataSource;
    }

尝试替换为:

private MyApp app = new MyApp();

有了这个:

@InjectMocks
private MyApp app;

您不能在未模拟的对象上设置模拟实例(不过您可以通过调用 setter 方法来设置它们)。而是尝试模拟 MyApp

@Mock
private MyApp app

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

然后你可以使用下面的语句来模拟DataSource

PowerMockito.when(app.getDataSource()).thenReturn(dataSource);