小编dig*_*nie的帖子

在Play上使用Clover执行代码覆盖!使用Ant的框架应用程序

我正在编写一个Ant脚本来对我的Play 进行一些额外的检查!框架应用.

目前,我正在通过执行exec调用"播放自动测试"从我的Ant脚本执行我的测试.

    <exec executable="${play.dir}/play.bat">
        <arg line="auto-test"/>
    </exec>
Run Code Online (Sandbox Code Playgroud)

有谁知道如何将Clover集成到Play测试套件中?显然,我并不依赖于必须使用上述方法运行我的测试.

我也尝试使用执行JUnit测试的传统方式编写Ant脚本(即使用Ant的junit目标),我遇到了两个问题:

  • 执行所有测试时,只有第一个会成功执行,而其他测试会因奇怪的原因而失败
  • 如果我只是在我的套件中公开一个测试并且测试成功运行,那么我会说代码覆盖率为0%.然后我认为我错误地设置了三叶草,但是,我创建了一个简单的类,它测试了一个什么也没做的生产类,覆盖率也达到了我的预期.

因此,如果我要沿着这junit条路走下去,我需要知道如何执行我所有的测试,以便它们可以一个接一个地成功运行(它在使用Play运行方式时有效play auto-test)我需要知道为什么Clover会这样做似乎没有找到Play测试触及的代码行.

(我知道有一个用于播放的Cobertura模块,但是,我发现Clover做得更好,告诉我一个准确的覆盖数字)

更新:不幸的是我无法复制我之前遇到的确切错误,因为当我尝试手动编译时遇到了编译问题.我已经开始使用Secure模块,它只包含Java源文件.因此,在我的Ant脚本中,我调用play precompile哪个产生Secure模块的字节代码(以及系统中的所有其他内容,包括我的代码).所以现在当我尝试使用Clover编译我的应用程序代码时,我认为编译器有点纠结,因为我有两个版本的类 - 一个由预编译命令(非三叶草)生成,一个由我自己生成蚂蚁编译(与三叶草):

[javac] C:\projects\testproject\out\clover\classes\clover8583527041716431332.tmp\model\HouseTest.java:45: incompatible types
[javac] found   : play.db.jpa.JPABase
[javac] required: models.House
[javac]         __CLR2_5_115y15ygoxiz3dv.R.inc(1527);House found = House.findById(id);
Run Code Online (Sandbox Code Playgroud)

所以我现在基本上有两个问题:

  • 我需要能够编译我的源代码,这些源代码也依赖于Play提供的模块(例如CRUD,Secure),这些模块没有编译版本,因此我尝试通过play precompile在Ant脚本中调用自己来解决它
  • 一旦我开始编译工作,我无疑会再次遇到原始问题,即无法使用junit目标执行测试.

更新#2:事实证明我得到的错误是由于findById调用需要从JPABase转到House(而不是IDE或者游戏似乎关心它).所以在我进入并为所有play的"find*"方法投了一个演员之后,我实际上得到了JUnit和Clover的报道! 但是......我现在遇到两种错误:

  • 在Play中创建的实体类可以通过扩展Model提供魔术方法的类来创建,例如find前面提到的那些方法以及count方法.Model超类实际上扩展了GenericModel,它通过抛出UnsupportedOperationException来实现这些方法.所以显然玩!在幕后做一些更神奇的事情来提供这些方法的实际实现.不幸的是,我的测试(和生产代码)依赖于计数等方法,但它们在我的ant/junit场景中抛出异常(注意:运行时一切正常play auto-test.

  • 我得到的另一个错误是由于我使用Spring模块.在我的一个类(根类)中,我打电话Spring.getBeanOfType(Some.class).现在我使用自动扫描,但是在ant/junit测试环境中,Spring模块还没有设置我的spring容器,因此调用只返回null.

我有一种感觉,有一个神奇的解决方案可以解决我的两个问题但是我不确定这个神奇的修复是什么.

java build clover playframework

12
推荐指数
1
解决办法
1363
查看次数

团队领导类型:更多程序员|| 更多!程序员

昨天我有另一个团队的团队负责人说他们花了一段时间来弄清楚我在维基页面上写的东西,因为我提到从源代码控制中获取代码"签出"显然混淆了他们.他们说他们用于Clear Case并且只听说过"加入一个项目"一词,并说他们很长时间没有真正编程.

虽然这很好,但是让我想到的是我多年来不同类型的团队领导者.我有一些几乎是纯粹管理的,我有那些同时做管理事务的程序员.

人们对他们拥有什么样的团队领导者有偏好吗?如果您的团队负责人积极参与您的产品开发,您如何关心?我发现团队领导者实际上坐下来并像团队其他成员一样编码,更有可能理解(根据我的经验):

  • 事情并不像听起来那么简单.我所拥有的团队领导者,他们不编码或很少编写代码,相信一切都是小菜一碟,不应该花太多时间(如果你想要一起破解它可能就是这种情况)
  • 他们更了解开发人员并不总是喜欢坐在长时间的会议中并尽力避免让他们的团队尽可能多地进行毫无意义的会议
  • 他们从技术角度理解你所说的话.那些可能没有编码一段时间的人可能没有达到许多新技术,技术或术语的速度

我发现拥有一个拥有开发人员头脑的团队领导者并且喜欢在代码中沾沾自喜,我觉得更令人满意.也许有些人喜欢团队领导者,他们与实际的编码方面保持距离,只是简单地完成工作,或者是我未提及的其他类型的团队领导者?

leader

9
推荐指数
3
解决办法
1674
查看次数

使用反射来检索未知类型的基元数组

我正在使用反射来检索实例字段,例如:

private int[] numbers = ....
Run Code Online (Sandbox Code Playgroud)

使用field对象,我可以检查字段是否包含数组,如果有,我想循环遍历数组中的int.因此,如果包含上述字段的对象被称为"foo",那么我会有这样的事情:

field.setAccessible(true);
Object value = field.get(foo);
Run Code Online (Sandbox Code Playgroud)

上面的值变量将包含我的int数组.如何将该对象视为常规数组并迭代其值?

编辑:抱歉,我错过了上述故事的关键点.我正在以通用方式执行上述操作,因此我不知道数组包含什么原语.它可能是一个int []或long []等.所以强制转换为int []在long []情况下是行不通的.哎呀!

java reflection

9
推荐指数
1
解决办法
3246
查看次数

在Play中声明测试依赖性!

有没有办法在依赖关系.yml文件中为Play声明一个测试依赖项!框架?我没有在文档中看到有关测试依赖项的任何信息.

例如,我可能想要使用诸如Mockito之类的测试库,但出于显而易见的原因没有在生产中使用它的类.

java dependency-management playframework

9
推荐指数
1
解决办法
1804
查看次数

Spring Wire一个静态类

我处理遗留代码库,其中未在春天有线了一类需要获得一类在春季接线.我希望创建一个在启动时连接的工厂类,然后我可以调用getInstance()方法来获取有线对象.最好的方法是什么?

例:

public class LegacyA {
    public void doSomething() {
        ...
        Foo foo = FooFactory.getInstance();
        ...
    }
}

public class FooFactory {
    private static Foo foo;

    public static Foo getInstance() {
        if (foo == null) throw new IllegalStateException();
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要在启动时连接FooFactory,以便LegacyA可以简单地调用getInstance(),以便它返回一个Foo实例(它也是在应用程序上下文中定义的bean).

<bean id="legacyA" class="LegacyA"/>

<bean id="foo" class="Foo"/>

<!-- I need this bean to be injected with foo so that the FooFactory can return a foo -->
<bean id="fooFactory" class="FooFactory"/>
Run Code Online (Sandbox Code Playgroud)

编辑:我不得不重新修改我的例子,因为我在自己的头脑中有点困惑...

java spring

8
推荐指数
1
解决办法
3万
查看次数

计算查询行的最有效方法

我正在使用Hibernate来检索特定查询的行数.假设我有一个名为'Person'的表,其中包含各种列.其中一列是'name'.

如果我想获得名为"安德鲁"的人数,哪种方式最有效?假设它们中的一些/全部存在性能差异.有没有更好的方法来使用Hibernate/SQL?

(1)选择所有列

Query query = session.createQuery("from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();
Run Code Online (Sandbox Code Playgroud)

(2)只选择名称列

Query query = session.createQuery("select name from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();
Run Code Online (Sandbox Code Playgroud)

(3)在查询中使用Count

Query query = session.createQuery("select count(*) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)

(4)在查询中使用Count和name列

Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)

编辑:对不起,我的列表中有两个3号

java sql hibernate

8
推荐指数
1
解决办法
1万
查看次数

从log4j appender中排除一个类

我有一个log4j.properties文件,看起来像这样:

log4j.logger.com.foo=INFO, foo-log
log4j.logger.com.foo.BarImpl=INFO, bar-log
Run Code Online (Sandbox Code Playgroud)

通常对于匹配包结构的类,com.foo我希望使用foo-logappender.但是,在该包中,我希望BarImpl日志使用bar-logappender而不是foo-logappender.目前,BarImpl编写的任何日志都由foo-log和bar-log处理(如预期的那样).如何让foo-log appender忽略BarImpl类?

java log4j

8
推荐指数
1
解决办法
1万
查看次数

将自定义标识符分配给@id属性

我正在迁移遗留系统以使用Hibernate 3.它目前生成自己的标识符.为了在我尝试将其移动到更好的状态之前保持系统当前所做的事情,我将如何指定(使用注释)我自己的类,它将在插入时返回自定义生成的标识符?

就像是:

@Id
@CustomIdGenerator(Foo.class) // obviously this is not a real annotation
public String getId() { ... }
Run Code Online (Sandbox Code Playgroud)

其中Foo类具有生成所述标识符的一种方法.

目前我只是setId(String id)手动调用该方法,但希望有更好的方法来处理这种情况.

java hibernate jpa

8
推荐指数
1
解决办法
7592
查看次数

访问一个HSQLDB的多个Java应用程序会导致应用程序挂起

这与我之前的问题半关联.正如上一个问题所述,我有一个桌面应用程序,它会调用另一个将启动特定进程的Main方法.桌面应用程序和单独的Main方法都将访问相同的HSQLDB数据库.

在实现这一目标之前,我的桌面应用程序刚刚使用类似这样的连接URL访问HSQLDB数据库:

jdbc:hsqldb:file:/some/path/myDatabase
Run Code Online (Sandbox Code Playgroud)

现在,这在单个用户环境中工作正常.既然我已经拥有一个桌面应用程序的多用户环境以及想要读/写此数据库的单独主进程,我想让这个数据库成为共享资源.

我已经看过HSQLDB文档以及关于创建共享HSQLDB数据库的这篇文章,但无济于事.

在帖子中,它讨论了通过代码启动服务器.我不认为这是我想要做的事情,因为我希望HSQLDB数据库一直在运行,因为桌面应用程序可能有多个用户.

查看官方的HSQLDB文档,它声明您可以像这样启动HSQLDB服务器:

java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb
Run Code Online (Sandbox Code Playgroud)

如果我用我自己的数据库文件和名称运行上面的命令,它似乎启动好了:

[Server@6ca1c]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@6ca1c]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@6ca1c]: Startup sequence initiated from main() method
[Server@6ca1c]: Loaded properties from [/some/path/myDatabase/server.properties]
[Server@6ca1c]: Initiating startup sequence...
[Server@6ca1c]: Server socket opened successfully in 16 ms.
Run Code Online (Sandbox Code Playgroud)

然后我将连接URL更改为以下内容:

jdbc:hsqldb:hsql://localhost/xdb
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不起作用.关于我做错了什么或者我可能错过什么的任何想法?

此外,当桌面应用程序调用外部Main方法时,桌面应用程序只会挂起,因为外部Main方法会注意到桌面应用程序似乎锁定了数据库.一旦我关闭桌面应用程序,外部Main方法实际上就会按照我的预期执行.

java hsqldb

8
推荐指数
1
解决办法
8276
查看次数

基于IntelliJ中的JPA实体绘制数据库模式

有没有人知道是否有可用于IntelliJ的插件,它将根据JPA实体类绘制数据库架构图?

java jpa intellij-idea

8
推荐指数
3
解决办法
6045
查看次数