Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单Mockito测试(Spring+;Dao)_Java_Spring_Mockito - Fatal编程技术网

Java 简单Mockito测试(Spring+;Dao)

Java 简单Mockito测试(Spring+;Dao),java,spring,mockito,Java,Spring,Mockito,我非常沮丧,因为我无法理解这一点。我已经阅读了数百万篇文章,但对于如何做到这一点,没有什么是明确的。我试着写一个Mockito测试只是为了练习 我有一个SpringJava应用程序,它从数据库中获取数据 这是applicationContext.xml <bean id="Lookup" class="com.gd.test.Lookup"> <property name="AssetClassDao" ref="assetClass" /> </bean&

我非常沮丧,因为我无法理解这一点。我已经阅读了数百万篇文章,但对于如何做到这一点,没有什么是明确的。我试着写一个Mockito测试只是为了练习

我有一个SpringJava应用程序,它从数据库中获取数据

这是applicationContext.xml

<bean id="Lookup" class="com.gd.test.Lookup">
    <property name="AssetClassDao" ref="assetClass" />
</bean>

<bean id="assetClass" class="com.gd.impl.AssetClassImpl">
    <property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="org.apache.commons.dbcp.BasicDataSource" />
    <property name="url"
        value="jdbc:sqlserver://ip:port;databaseName=test" />
    <property name="username" value="user" />
    <property name="password" value="pass" />
</bean>
AssetClassImpl.java

public class AssetClassImpl implements AssetClassDao {

private DataSource dataSource;
AssetClass ac = new AssetClass();

@Override
public AssetClass getAssetDataById(int id) {

    String sql = "select id, name from TABLE where id="
            + String.valueOf(id);

    Connection conn = null;

    try {
        conn = dataSource.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);

        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            ac.setASSET_CLASS_ID(rs.getString("id"));
            ac.setASSET_CLASS_NAME(rs.getString("name"));
        }

        rs.close();
        ps.close();
        return ac;

    } catch (SQLException e) {
        e.printStackTrace();
    }

    return ac;
}

public DataSource getDataSource() {
    return dataSource;
}

public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}
}
Lookup.java

public class Lookup {

private AssetClassDao assetClassDao;

public void runNameLookup() throws IOException {

    AssetClass byOne = assetClassDao.getAssetDataById(5);

    System.out.println(byOne.toString());

}

public AssetClassDao getAssetClassDao() {
    return assetClassDao;
}

public void setAssetClassDao(AssetClassDao assetClassDao) {
    this.assetClassDao = assetClassDao;
}

}
查询返回“5”作为ID,“Mortgage”作为名称。 对于我用Mockito编写的测试,它如何知道使用哪个实现

我的测试:

public class TestLookup {
@Mock
private AssetClassDao acd;

@Mock
private Lookup al;

@Mock
private AssetClass ac;

@Before
public void setupMock(){
    MockitoAnnotations.initMocks(this);
    acd = mock(AssetClassImpl.class);
}

@Test
public void testDataById(){
    when(acd.getAssetDataById(5)).thenReturn(ac);
    System.out.println(acd.getAssetDataById(5).getNAME());
}
}

如何正确测试这些值

通过编写以下语句,您正在创建一个新的类对象
AssetClass

AssetClass ac = new AssetClass();
如果您使用的是Spring,则应将其作为依赖项之一注入,如下所示:

@Autowired
private AssetClass ac;
现在,您可以通过在测试类中编写以下内容来模拟此依赖关系:

@Mock
private AssetClass ac;
此外,您还必须模拟其他依赖项,如
数据源
连接
等,并执行以下操作:

@Mock
private DataSource dataSource;

@Mock
private Connection conn;

...

Mockito.when(dataSource.getConnection()).thenReturn(conn);

我希望这将为您提供一些Mockito的精髓以及如何使用它。

我不知道我还必须模拟数据源和连接。。。我会努力的now@gd000除了
AssetClass
之外,您还应该模拟
DataSource
Connection
PreparedStatement
ResultSet
@Mock
private DataSource dataSource;

@Mock
private Connection conn;

...

Mockito.when(dataSource.getConnection()).thenReturn(conn);