为什么没有(标准的,Java认证的)解决方案,作为Java语言本身的一部分,从Java方法返回多个值,而不是开发人员必须使用他们自己的方法,如地图,列表,对等.?为什么Java不支持n元组对象?
特别是考虑可以将两个对象一起修改(串联)的普通私有方法,并且在这种情况下作为返回的类型对象听起来有点过分.
我正在学习TDD,但很难接受它,因为它不是直截了当的.
我无法回答的问题是" 如何在任何实现代码存在之前编写测试? ".
如果我们的目标类/目标方法/目标参数类型/目标返回类型不存在,
每个人都说出为什么,但不是如何
我已经尽力找到资源,详细说明在生产代码之前编写测试但是,假设我错过了良好的资源,他们中的大多数都充满了陈词滥调,解释了为什么TTD比专注于采用它的实践更重要.
一个用例示例.
我们假设我们正在为大学开发软件,我们的用例是课程注册.
为了简单起见,让我们将这个讨论限制在内
伪代码
ENROLL(studentId, courseId)
//check if student enrolled in less than 3 courses in the same semester as given courseId belongs in.
//if yes, enroll him/her.
//if not, return an error.
Run Code Online (Sandbox Code Playgroud)
上面的实际实现可能涉及几个涉及服务,daos等的类.
请问您能解释一下如何逐步测试 - 开发它吗?如果您使用TDD实现这一点,您是如何逐步完成的.
我希望这可以帮助像我这样的许多挣扎.
我想知道如何编写一个CMake设置,允许使用任何编译器和操作系统编译x86和x64架构.
我正在尝试写入多个文件,确切地说是19.写了几百次之后,我得到了Java IOException:打开的文件太多了.但是,就像我说的那样,我打开了19个文件,并且我在开始时打开了所有文件.这里有什么问题?我可以验证写入是否成功.
编辑:我没有使用try-catch-finally块.我让函数抛出异常.现在我把try-catch-finally放在他们周围,他们似乎做得更好.
大多数人都是对的,因为我打开的文件超出了我的想象.还在跟踪事情.稍后我会发布更新.
重新编辑:确保所有文件访问都用try-catch包装 - 最终修复了问题.谢谢
我主要是一个C++编码器,到目前为止,我没有真正为我的所有代码编写测试.我已经确定这是一个坏主意(tm),在添加了巧妙地破坏旧功能的新功能之后,或者,根据您希望如何看待它,引入了他们自己的一些新"功能".
但是,单元测试似乎是一种非常脆弱的机制.您可以在"完美"条件下测试某些内容,但是在内容中断时您无法查看代码的执行情况.例如,对于数据X,例如它是一个爬虫,假设它抓取了一些特定的站点.你只是保存样本页面,对它们进行测试,并希望这些站点永远不会改变吗?这将做工精细的回归测试,但是,你会写什么样的测试,以不断地检查这些网站生活,让你知道当应用程序不这样做的工作,因为该网站改变了一些东西,现在会导致应用程序崩溃?您不希望您的测试套件监控代码的意图吗?
上面的例子有点做作,我还没有遇到过(如果你还没有猜到).但是,让我挑选一些东西.如何测试应用程序将在降级的网络堆栈面前完成其工作?也就是说,说你有丢包适量,对于一个原因或其他,和你有一个功能,DoSomethingOverTheNetwork()它应该以优雅降级的时候,它应该堆栈不执行; 但是呢?开发人员通过故意设置一个网关来亲自测试它,该网关在第一次写入时丢弃数据包以模拟坏网络.几个月后,有人检查了一些巧妙地修改某些内容的代码,因此没有及时检测到降级,或者,应用程序甚至没有识别出降级,这种情况从未被发现,因为你无法运行现实世界使用单元测试这样的测试,你呢?
那么,文件损坏怎么样?假设您将一个服务器列表存储在一个文件中,并且校验和看起来没问题,但数据并不是真的.您希望代码处理它,您编写一些您认为可以执行此操作的代码.您如何测试它是否与应用程序的生命周期完全相同?你能?
因此,脆弱.单元测试似乎只在完美的条件下测试代码(这是通过模拟对象等来提升的),而不是它们在野外会面对的.不要误解我的意思,我认为单元测试很棒,但是只有它们组成的测试套件似乎是一种聪明的方法,可以在代码中引入细微的错误,同时对它的可靠性过于自信.
我如何解决上述情况?如果单元测试不是答案,那是什么?
编辑:我看到很多答案都说"只是嘲笑它".好吧,你不能"只是模仿它",这就是原因:以我的降级网络堆栈为例,让我们假设你的函数有一个定义良好的NetworkInterface,我们将嘲笑它.应用程序通过TCP和UDP发送数据包.现在,让我们说,嘿,让我们使用模拟对象模拟界面上10%的损失,看看会发生什么.你的TCP连接增加了他们的重试次数,并增加了他们的后退,所有这些都是很好的做法.你决定改变你的UDP数据包的X%来实际建立TCP连接,有损接口,我们希望能够保证一些数据包的传输,而其他数据包不应该丢失太多.效果很好.同时,在现实世界中..当你增加TCP连接数(或TCP上的数据)时,在一个有足够损耗的连接上,你最终会增加你的UDP数据包丢失,因为你的TCP连接将最终重新开始 - 越来越多地发送他们的数据和/或减少他们的窗口,导致10%的数据包丢失现在实际上更像是90%的UDP数据包丢失.Whoopsie.
没什么大不了的,让我们把它分解为UDPInterface和TCPInterface.等一下......那些是相互依赖的,测试10%的UDP丢失和10%的TCP丢失与上面没有什么不同.
所以,问题是现在你不仅仅是对代码进行单元测试,而是将你的假设引入操作系统的TCP堆栈的工作方式.而且,这是一个坏主意(tm).比避免整个惨败更糟糕的想法.
在某些时候,您将不得不创建一个模拟操作系统,其行为与您的真实操作系统完全相同,除非是可测试的.这似乎不是一个很好的前进方式.
这是我们经历过的事情,我相信其他人也可以添加他们的经验.
我希望有人会告诉我,我错了,并指出原因!
谢谢!
什么是自然排序.假设我有一个Employee对象,其中包含姓名,年龄和加入日期,按自然顺序排序?
我有一个简单的JPA实体,它使用生成的long"ID"作为其主键:
@Entity
public class Player {
private long id;
protected Player() {
// Do nothing; id defaults to 0L
}
@GeneratedValue
@Id
public long getId() {
return id;
}
protected void setId(final long id) {
this.id = id;
}
// Other code
}
Run Code Online (Sandbox Code Playgroud)
在此类对象的生命周期中的某个时刻,JPA必须调用setId()以记录生成的ID值.我的问题是,这是什么时候发生的,以及说明这一点的文档在哪里.我查看了JPA规范,但找不到明确的声明.
JPA规范说(重点补充):
托管实体实例是具有持久标识的实例,该标识当前与持久性上下文相关联.
这是否试图说必须管理对象具有@Id重要意义?说明EntityManager.persist()(强调添加)的文档使"实例管理和持久",这是否意味着@Id由该方法设置?或者直到你打电话EntityTransaction.commit()?
当@Id设置可能是不同的JPA提供商不同,也许不同的生成策略.但是,最安全(可移植,符合规范)的假设是什么,你可以在生命周期的最早点设置它?
我想知道是否有一种方法可以根据String.
我尝试使用UUID 生成相同的UUID,看起来它不提供此功能.
Dave Syer(SpringSource)在他的博客中写道:
不幸的是,关于commons-logging的最糟糕的事情,以及使它不受新工具欢迎的因素,也是运行时发现算法.
为什么?它的运行时发现算法有什么问题?性能?
java ×7
unit-testing ×2
architecture ×1
c++ ×1
cmake ×1
compilation ×1
file-io ×1
jpa ×1
junit ×1
jvm ×1
logging ×1
methods ×1
mocking ×1
primary-key ×1
return-type ×1
sorting ×1
spring ×1
tdd ×1
testing ×1
uuid ×1