小编Eya*_*oth的帖子

Java中的构造函数重载 - 最佳实践

有一些类似的主题,但我找不到一个有足够答案的主题.

我想知道在Java中构造函数重载的最佳实践是什么.我已经对这个问题有了自己的想法,但我想听听更多建议.

我指的是简单类中的构造函数重载和构造函数重载,同时继承已经重载的类(意味着基类具有重载的构造函数).

谢谢 :)

java constructor overloading constructor-overloading

105
推荐指数
3
解决办法
17万
查看次数

如何模拟数据库进行测试(Java)?

我正在用Java编程,我的应用程序正在大量使用DB.因此,能够轻松测试我的数据库使用对我来说非常重要.
DB测试的全部内容是什么?对我来说,他们应该提供两个简单的要求:

  1. 验证SQL语法.
  2. 更重要的是,根据给定的情况检查数据是否被正确选择/更新/插入.

那么,似乎我所需要的只是一个数据库.
但实际上,我不喜欢,因为使用数据库进行测试的困难很少:

  • "只要让自己成为一个测试数据库,它有多难?" - 嗯,在我的工作场所,拥有个人测试数据库是非常不可能的.您必须使用"公共"数据库,每个人都可以访问.
  • "这些测试肯定不会很快......" - DB测试往往比通常的测试慢.进行慢速测试真的不太理想.
  • "这个程序应该处理任何案件!" - 尝试模拟数据库中的每个案例变得有些烦人甚至无法实现.对于每种情况,都应该进行一定量的插入/更新查询,这很烦人并且需要时间.
  • "等一下,你怎么知道那张桌子里有542行?" - 测试的主要原则之一是能够以与测试代码不同的方式测试功能.使用DB时,通常有一种方法可以做某事,因此测试与核心代码完全相同.

所以,你可以弄清楚我在测试时不喜欢数据库(当然,我必须在某些方面达到这个目的,但是在我发现大多数错误使用之后,我宁愿在我的测试后到达那里.其余的测试方法).但我在寻找什么?

我正在寻找一种使用文件系统或虚拟内存来模拟数据库,模拟数据库的方法.我想也许有一个Java工具/包允许简单构建(使用代码接口)每个测试的数据库模拟,模拟表和行,SQL验证,以及用于监视其状态的代码接口(而不是使用SQL) ).

你熟悉这种工具吗?


编辑:谢谢你的回答!虽然我要求一个工具,你也提供了一些关于这个问题的提示:)我需要一些时间来查看你的报价,所以我现在不能说你的答案是否令人满意.

无论如何,这里是我正在寻找的更好的视图 - 想象一个名为DBMonitor的类,它的一个功能是查找表中的行数.这是一个虚构的代码,说明我如何使用JUnit测试该功能:

public class TestDBMonitor extends TestCase {

    @Override
    public void setUp() throws Exception {

       MockConnection connection = new MockConnection();

       this.tableName = "table1";
       MockTable table = new MockTable(tableName);

       String columnName = "column1";
       ColumnType columnType = ColumnType.NUMBER;
       int columnSize = 50;
       MockColumn column = new MockColumn(columnName, columnType, columnSize);
       table.addColumn(column);

       for (int i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

java database testing unit-testing jdbc

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

ScalaMock:如何模拟/存根方法每次调用返回不同的值?

使用ScalaMock,我想模拟/存根一个类方法,因此它将为每次调用返回一个不同的值(调用顺序很重要).

我可以用mock和实现这一点expects,但这将迫使我验证这些调用.

我可以这样做stub吗?

另外,我怎么能说"第一次返回X,然后总是返回Y"(两者都带有mockstub)?

testing scala mocking scalamock

8
推荐指数
2
解决办法
9295
查看次数

如何在 IntelliJ 中找到 Scala 类的构造函数的用法?

是否有可能在 IntelliJ 中找到 Scala 类的构造函数的用法?

在此类构造函数上使用“查找用法”时,它也适用于类签名的每个用法(因为签名在类及其构造函数之间共享)。

usability scala intellij-idea

5
推荐指数
1
解决办法
268
查看次数

用于存储键值映射的最佳PostgreSQL数据类型?

我想将一个简单的键值字符串映射存储为PostgreSQL表中的一个字段。我打算将地图作为一个整体来对待;即,始终选择整个地图,并且永远不要通过其键或值进行查询。

我读过比较hstorejson和之间的文章jsonb,但是这些文章并没有帮助我选择最适合我的需求的数据类型:

  • 仅键值,无需嵌套。
  • 仅字符串,没有其他类型,也没有null
  • 鉴于我在该领域的预期用途,存储效率高。
  • 快速解析查询到的地图。

哪种数据类型最适合我的用例?

postgresql json sqldatatypes hstore jsonb

5
推荐指数
1
解决办法
4321
查看次数

使用TypeTag的泛型类型上的Scala模式匹配会生成警告,而ClassTag不会生成警告吗?

我有两个非常相似的方法.唯一的区别是使用ClassTagTypeTag:

def matchClass[A: ClassTag](v: Any) =
    v match {
        case a: A => "it's A"
        case _ => "not A"
    }

def matchType[A: TypeTag](v: Any) = ... // same code as matchClass
Run Code Online (Sandbox Code Playgroud)

将显示编译警告matchType,但不会显示matchClass:
abstract type pattern A is unchecked since it is eliminated by erasure case a: A

为什么会有警告?为什么它只显示TypeTag和不显示ClassTag

reflection scala compiler-warnings

4
推荐指数
1
解决办法
2857
查看次数

事务是在PostgreSQL 9.5.2上自动提交的,没有更改选项吗?

我刚刚设置了一个新的PostgreSQL 9.5.2,似乎我的所有事务都是自动提交的.

运行以下SQL:

CREATE TABLE test (id NUMERIC PRIMARY KEY);
INSERT INTO test (id) VALUES (1);
ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

导致警告:

WARNING: there is no transaction in progress
ROLLBACK
Run Code Online (Sandbox Code Playgroud)

不同的事务上,以下查询:

SELECT * FROM test;
Run Code Online (Sandbox Code Playgroud)

实际上返回行1(就像提交了插件一样).

我试图autocommit出发,但似乎这个功能不再存在(我得到了unrecognized configuration parameter错误).

这到底是怎么回事?

sql postgresql transactions autocommit

4
推荐指数
1
解决办法
9943
查看次数

尝试在"一个"实体上设置"多个"时,奇怪的JPA一对多行为

我使用JPA(特别是Hibernate)映射了两个实体.这些实体有一对多的关系(我简化了演示):

@Entity
public class A {

    @ManyToOne
    public B getB() { return b; }
}

@Entity
public Class B {

    @OneToMany(mappedBy="b")
    public Set<A> getAs() { return as; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我试图通过使用关系的单侧/非所有者侧的setter(即被引用的表)来创建这些实体的两个实例之间的关系:

em.getTransaction().begin();

A a = new A();
B b = new B();
Set<A> as = new HashSet<A>();
as.add(a);
b.setAs(as);

em.persist(a);
em.persist(b);
em.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)

但是,关系不会持久保存到DB(为实体A创建的行不引用为实体B创建的行).为什么会这样?我希望它能起作用.

此外,如果我从@OneToMany注释中删除"mappedBy"属性,它将起作用.再次 - 为什么会这样?以及删除"mappedBy"属性可能产生的影响是什么?

entity-relationship hibernate jpa

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

JMockit:如何根据构造函数中给出的参数模拟方法?

我想使用JMockit模拟以下类:

public class A {

    private int n;

    public A(int n) {
        this.n = n;
    }

    public boolean isCorrect() {
        return n % 2 == 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

该类在我的代码中初始化,我通常无法访问测试中的那部分代码.
在我的一些测试中,我想模拟它,以便如果类的值初始化为3,'isCorrect'将返回true(这不是正常的行为),并且在其他一些测试中我想要模拟它以便无论如何初始化,'isCorrect'都将返回false.

我试图在文档中找到一种方法,但它不是那么用户友好,我放弃了它.

java jmockit mocking

0
推荐指数
1
解决办法
8130
查看次数

将可变集合转换为不可变集合会引入性能损失

我遇到了一个关于将可变集合转换为不可变集合的奇怪行为,这可能会显着影响性能.

我们来看看下面的代码:

val map: Map[String, Set[Int]] = createMap()
while (true) {
    map.get("existing-key")
}
Run Code Online (Sandbox Code Playgroud)

它只创建一次映射,然后重复访问其中一个enries,其中包含一个值作为值.它可以通过以下几种方式创建地图:

使用不可变集合:

def createMap() = keys.map(key => key -> (1 to amount).toSet).toMap
Run Code Online (Sandbox Code Playgroud)

或者使用可变集合(请注意最后的两个转换选项):

def createMap() = {
    val map = mutable.Map[String, mutable.Set[Int]]()
    for (key <- keys) {
        val set = map.getOrElseUpdate(key, mutable.Set())
        for (i <- 1 to amount) {
            set.add(i)
        }
    }
    map.toMap.mapValues(_.toSet) // option #1
    map.mapValues(_.toSet).toMap // option #2
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是,可变#1代码创建了一个映射,toSet无论何时get调用(如果条目存在),它都会调用其值,这可能会导致显着的性能损失(取决于用例).

为什么会这样?如何避免这种情况?

collections performance scala

0
推荐指数
1
解决办法
47
查看次数