maven - 在 Spring Junit 测试用例中获取 jdbcTemplate null

标签 maven spring-mvc junit4

我正在为 Spring 3 Restful 服务编写 junit 测试用例。当我尝试将其作为 junit 执行时,我得到的 JdbcTemplate 为 null。我不确定我在哪里犯了错误。请帮助我摆脱困境......

LoginServiceImpl.java 文件,

private NamedParameterJdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource(DataSource dataSource) {
    jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
    System.out.println("--------------"+jdbcTemplate.toString());
}

private static Map<String, AuthToken> tokenHash = new ConcurrentHashMap<String, AuthToken>();

private static String authTokenDetailsSql = "select * from authtoken where token = :token";

@Override
@RequestMapping(value = "/register", method = RequestMethod.POST)
@ResponseBody
public ServiceBean newAccount(@RequestBody Registration registration) {
    String newAccountSql = "INSERT INTO account (email,password,name) VALUES (:email,:password,:name)";
    ServiceDataBean<AuthToken> retBean = new ServiceDataBean<AuthToken>();
    try {
        System.out.println("register service calling.....");
        MapSqlParameterSource namedParameters = new MapSqlParameterSource();
        namedParameters.addValue("email", registration.getEmail());
        messageDigest = MessageDigest.getInstance("MD5");
        byte[] md5 = new byte[64];
        messageDigest.update(registration.getPassword().getBytes("iso-8859-1"), 0, registration.getPassword().length());
        md5 = messageDigest.digest();
        namedParameters.addValue("password", convertedToHex(md5));
        namedParameters.addValue("name", registration.getName());
        GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

        // TODO what to do with the updInt also check it's not -1
        int updInt = jdbcTemplate.update(newAccountSql, namedParameters, generatedKeyHolder);
        long accountId = (Long) generatedKeyHolder.getKeys().get("GENERATED_KEY");
        registration.getDevice().setOwner(registration.getId());
        fotoframz.register(registration.getDevice());
        Login login = new Login();
        login.setEmail(registration.getEmail());
        login.setPassword(registration.getPassword());
        login.setDevice(registration.getDevice());
        retBean = (ServiceDataBean<AuthToken>) this.login(login);
        System.out.println("form register");
    } catch (Throwable e) {
        retBean.setStatusCode("001");
        e.printStackTrace();
    }
    return retBean;
}

我在 int updInt = jdbcTemplate.update(newAccountSql, namedParameters, generatedKeyHolder); 处得到 jdbctemplate=null

我的applicationContext-test.xml文件位于src/test/resources文件夹中..applicationContext-test.xml文件

<context:component-scan base-package="net.mss.ff.services" />       
<context:property-placeholder location="classpath:/app.properties" />

<!-- <task:annotation-driven /> -->
<context:annotation-config />
<!-- <import resource="apicontroller_v1-servlet.xml"/>
<import resource="applicationContext.xml"/> -->

<bean id="photoService" class="net.mss.ff.services.core.api.impl.PhotoServiceImpl">
    <property name="rootStorageFolder" value="${storage.root}" />
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}" />

LoginServiceImplTest

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext-test.xml"})
public class LoginServiceImplTest {

LoginServiceImpl loginServiceObj = new LoginServiceImpl();
Device deviceMock;

@Autowired
private Fotoframz fotoframz;

/*private NamedParameterJdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource(DataSource dataSource) {
    jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
}*/

@Before
public void setUp() throws Exception {
    //loginServiceObj = new LoginServiceImpl();
}

@After
public void tearDown() throws Exception{

}

/**
 * Test method for {@link net.mss.ff.services.core.api.impl.LoginServiceImpl#newAccount(net.mss.ff.services.core.beans.Registration)}.
 */
@Test
public void testNewAccount() {
    Registration mockRegObj = new Registration();
    deviceMock = new Device();
    deviceMock.setActive(false);
    deviceMock.setHeight(45);
    //deviceMock.setId(4568);
    deviceMock.setName("Android");
    deviceMock.setOwner(1111);
    deviceMock.setPlatform("Windows NT");
    deviceMock.setUuid("522601");
    deviceMock.setVersion("1.0");
    deviceMock.setWidth(76);
    mockRegObj.setEmail("<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="55373737153238343c397b363a38" rel="noreferrer noopener nofollow">[email protected]</a>");
    /*mockRegObj.setId(399);*/
    mockRegObj.setName("bbb");
    mockRegObj.setPassword("BBB");
    mockRegObj.setDevice(deviceMock);
    loginServiceObj.newAccount(mockRegObj);

    //assertEquals("New Account Creation", "", "");
}

} 测试类中需要修改任何内容,请告诉我..

最佳答案

在您的测试中,LoginServiceImpl loginServiceObj = new LoginServiceImpl(); 不是由 spring 实例化的,因此不会应用任何注释。您需要 Autowiring 它,或者以其他方式注入(inject)它。 Spring 3.2 使这种事情变得 super 简单且好用。

我的回答的其余部分仍然是很好的建议: 您尚未在 java 代码中声明或实例化 jdbctemplate。并且您还没有在 xml 文件中定义它。

你需要这个

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
            <ref bean="dateSource"/>
        </property>
    </bean>

然后将其作为实例变量(假设您使用注释)

   @Resource(name = "jdbcTemplate")
    private JdbcTemplate jdbcTemplate;

关于maven - 在 Spring Junit 测试用例中获取 jdbcTemplate null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14852784/

相关文章:

java - 无法在单个单元测试中使用 maven 的 spring-boot-starter-test 方法 - Spring Boot

maven dependency.systemPath 必须指定绝对路径

java - 如何更改weblogic的spring boot上下文路径?

java - 使用整数字段进行 Hibernate 验证

java - 在junit4中执行测试方法

java - 使用 findBug 插件发现错误时如何使 Maven 构建失败

java - MessageBodyReader 支持 DTO 类吗?

java - JsonIgnore 不适用于 Spring

java - 如何使用 Mockito 测试要测试的类中的 throws 子句

java - 是否可能有某种机制迫使开发人员为类中的所有方法编写 Junit 测试用例?