我必须为一组复杂的业务规则编写一个非常大的测试套件,这些规则目前以几种表格形式捕获(例如,如果参数XYZ是这样的,那么值应该在V1和V2之间).每个规则都有一个名称和自己的语义.
我的最终目标是建立一个测试套件,组织成子测试套件,每个规则都有一个测试用例.
一种选择是将所有这些规则硬编码为测试.这是丑陋的,耗时的,不灵活的.
另一种方法是编写一个Python脚本,该脚本将读取规则文件并使用单元测试生成Java类.如果可以的话,我宁愿避免这种情况.另一种变化是使用Jython.
理想情况下,我希望有一个可以读取文件的测试套件,然后在其中定义子套件和测试.所有这些测试都可以从表文件采取了一定的值进行初始化,在我们的系统中运行的固定入口点,然后调用基于预期值的结果会验证功能.
是否有合理的方法只使用Java来解决这个问题?
更新:我可能在某种程度上简化了我们的规则.其中一些确实是表格式(excel风格),另一些则更模糊.一般的问题仍然存在,因为我可能不是第一个遇到这个问题的人.
当我序列化一个对象时,我可以在类级别使用serialVersionUID机制来确保这两种类型的兼容性.
但是,当我序列化枚举值字段时会发生什么?有没有办法确保序列化和反序列化之间没有操作枚举类型?
假设我有一个类似OperationResult {SUCCESS,FAIL}的枚举,以及一个被序列化的对象中名为"result"的字段.当对象被反序列化时,即使有人恶意颠倒了这两个结果,我如何确保结果仍然正确?(假设枚举在其他地方声明为静态枚举)
我出于好奇而想知道 - 我使用jar级别的身份验证来防止操纵.
我正在(与其他人一起)为没有CS背景的IT专业人员教授计算机科学的相对入门课程.自从我开发了自动机和语法的课程资料以来,我还负责编写有关编译器和编译器构造的知识.
多年前,当我在大学学习编译时,我们所有的例子都来自Lex和Yacc.这些仍然广泛使用吗?有没有更常用于Java的东西?学生精通C和Java,但从未使用过解析器生成器.
任何关于教什么的提示都将不胜感激
我有几个服务器进程,偶尔会响应来自客户端的消息并执行只读事务.
大约几天后,服务器正在运行,它们停止正常工作,当我检查时发现有大量关于连接被关闭的消息.
当我检查出来时,事实证明,默认情况下,hibernate在某种开发模式下工作,在几种小时后连接被丢弃,我开始使用c3po进行连接池.
但是,即使使用c3po,我在服务器启动后大约24小时左右就会遇到这个问题.
有没有人遇到过这个问题并知道如何解决它?我对配置hibernate的复杂性不够熟悉.
我已经使用Python一段时间了,我发现将方法声明为静态的语法是特殊的.
将声明一个常规方法:
def mymethod(self, params)
...
return
Run Code Online (Sandbox Code Playgroud)
声明了一个静态方法:
def mystaticethod(params)
...
return
mystaticmethod = staticmethod(mystaticmethod)
Run Code Online (Sandbox Code Playgroud)
如果您不添加静态方法行,编译器会抱怨自我丢失.
这是一种非常简单的非常简单的方法,在其他语言中只需使用关键字和声明语法.谁能告诉我这种语法的演变?这仅仅是因为课程被添加到现有语言中吗?
由于我可以将staticmethod行移动到类的后期,因此它还表明解析器在簿记方面的工作量更大.
请注意,我知道稍后添加的装饰器语法,我很想知道从语言设计角度来看原始语法是如何产生的.我能想到的唯一想法是staticmethod应用程序调用一个将函数对象转换为静态方法的操作.
我需要一种方法来从JVM中运行的Java代码中唯一地永久地标识JVM的实例.
也就是说,如果我在同一台机器上同时运行两个JVM,则每个JVM都是可区分的.它也可以与在其他计算机上运行JVM以及在同一台计算机上的未来执行区分开来,即使重用了进程ID也是如此.
我想我可以通过识别开始时间,机器MAC和进程ID来实现这样的东西,并以某种方式组合它们.我想知道是否有一些标准的方法来实现这一目标.
更新:我看到每个人都推荐了整个会话的UUID.这似乎是一个好主意,虽然可能有点太重量级.这是我的问题:我想使用JVM id在每个JVM执行中创建多个唯一标识符,以某种方式合并JVM实例.
我的理解是你不应该将其他数字混合到一个UUID中,因为不再保证唯一性.另一种方法是将UUID转换为字符串并将其链接,但随后它变得太长.克服这个想法?
可能重复:
什么是空指针异常?
Java:为什么NullPointerExceptions不是NullReferenceExceptions?
我们空闲的好奇心,有谁知道为什么Java中的空引用异常被称为NullPointerException?
似乎违反直觉的是,在正式没有指针的新语言中,在使用空引用时将选择使用此名称.
如果有人能指出我的权威解释,那将不胜感激.
我经常遇到一个由接口或类表示的概念,然后我有一系列扩展它的子类/子接口.
例如:通用"DoiGraphNode"表示资源的"DoiGraphNode"表示Java资源的"DoiGraphNode"具有相关路径的"DoiGraphNode"等.
我可以想到三个命名约定,并希望评论如何选择.
选项1:始终以概念的名称开头.
因此:DoiGraphNode,DoiGraphNodeResource,DoiGraphNodeJavaResource,DoiGraphNodeWithPath等.
亲:很清楚我在处理什么,很容易看到我的所有选项
骗局:不是很自然?一切看起来都一样吗?
选项2:将特殊内容放在开头.
因此:DoiGraphNode,ResourceDoiGraphNode,JavaResourceDoiGraphNode,PathBaseDoiGraphNode等等.
亲:我在代码中看到的很清楚
Con:发现它可能很困难,特别是如果我不记得名字,缺乏视觉一致性
选项3:放入特殊内容并删除一些冗余文本
因此:DoiGraphNode,ResourceNode,JavaResourceNode,GraphNodeWithPath
Pro:没有那么多写和读Con:看起来像cr*p,非常不一致,可能与其他名称冲突
我很好奇在Java中给定外部类的实例来实例化内部类的语法选择.
语法是:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Run Code Online (Sandbox Code Playgroud)
但为什么不呢:
OuterClass.InnerClass innerObject = new outerObject.InnerClass();
Run Code Online (Sandbox Code Playgroud)
前者似乎暗示new是直接与类关联的方法或操作符,但我的理解是不是这种情况(与C++不同)?
我最喜欢的大学数据结构之一就是Trie.如果共享前缀,它是一个很好的数据结构,用于保存大量字符串.查找也很好,因为它们是在字符串的O(| length |)处完成的,无论集合中有多少字符串.
相比之下,平衡树的设置项数量为O(log N),加上您为比较支付的费用.哈希表将涉及哈希计算,比较等.
因此,令我惊讶的是,在大多数语言的标准库中没有Trie实现.
我能想到的唯一原因是内存访问成本太高的可能性.如果进行树查找,则不是在调查O(log N)位置,而是在进行O(| length |)不同的位置,并产生所有后果.如果字符串很长,这可能会导致太多.
所以我想知道:我刚才描述的问题有多少?当您需要存储大型字符串或字符串映射时,您会怎么做?