理解CKEditor5的schema
我们知道,CKEditor5是一个用MVC架构设计的富文本编辑器。如上图所示,三层分别是:Model,Controller, View首先,第一个问题是schema属于那一层?经过官方文档的初步学习,我们可以看到:editor.model.schema; // -> The model's schema.因此,我们可以得出结论:schema属于模型层:其次我们需
Injector框架理解(二)
今天我们继续学习didi这个依赖注入框架,上一节我们知道了怎么定义组件,怎么定义模块,怎么通过Injector这个类来载入模块和获取组件。今天我们来学习如何重用模块:我们首先定义好组件和模块:const {Injector} = require('didi');
class FooType {
constructor() {
this.name = 'foo';
}
}
Injector框架理解(一)
在可测试js的框架学习过程中,我们不断提到了依赖注入,依赖注入使用最多的就是在java中的spring,为了在js中使用依赖注入,我们今天学习另一个不那么常用的框架:didi首先看看安装命令npm install didi这个时候,我看到项目下的package.json{
"name": "babelwebpack",
"version": "1.0.0",
"description"
Hibernate映射计算的属性
在一般的实体映射中,一般都是一个属性对应数据库的某一列。今天我们来看看如何映射通过其他属性计算出来的属性。好了先看看具体的两个领域类:新建一个Account.java@Entity(name = "Account")
@Table(name = "account")
public class Account {
@Id
private Long id;
@ManyToO
JPA——persistence.xml深入理解
在本文中,我们会解释 JPA persistence.xml 配置文件的用途,以及如何使用可用的 XML 标记或属性设置 Java Persistence 应用程序。虽然 Spring 应用程序可以在不需要 XML JPA 配置文件的情况下进行引导,但理解每个配置选项的含义仍然很重要,因为 Spring 在构建 Java Persistence LocalContainerEntityManage
JPA实体状态学习-(瞬时态:Transient)
为了学习实体的状态,我们还是贴出这张实体状态转换迁移图:Transient(瞬时态)按照上图的描述,java对象在内存中被赋值后,没有调用entityManager.persist()方法之前实体对象所处的状态就是瞬時態举个例子:Teacher teacher = new Teacher("email@dot.com");此时,实例teacher就处于new/transient态(备注:这里的ne
JPA实体状态深入理解
我们在学习JPA实体状态的时候,常常会问,JPA的实体有多少状态呢?相信这个问题不难回答:瞬时态(transient)托管态(persistent)游离态(detached)移除态(removed)注意:这里最后一个移除态,有的时候也叫删除态(deleted),至于它和移除态有啥区别,暂时没有想到,如果您对此有更加深刻的理解,请留言回复。为什么会有这四种状态呢?啥,这个也有为啥,网上不是都这么说的
如何集成多个限界上下文?
在进行领域驱动设计时,发现有两个情境很容易产生误解?他们是:多个限界上下文集成和聚合设计。在本文中,主要介绍多个限界上下文集成。通用语言任何研究过 DDD 的人都已经了解到与其一起使用的许多概念:限界上下文、实体、聚合、值对象等。其中一些概念(实体,聚合,值对象)与代码直接关联,很容易理解和使用,而另一些(限界上下文)则由于其抽象性而难以吸收应用。通用语言就是这样一种情况,尽管它简单而强大,但很容
JPA实现自定义类型(一)
我们知道,Hibernate是一个JPA的默认实现,因此,在本文中,我们用hibernate来实现一个自定义类型。自定义类型有多种情况,比如:基本类型——基本 Java 类型的映射 可嵌入——复合 java 类型/POJO 的映射 集合——映射基本和复合 java 类型的集合先来实现一种自定义的基本类型,具体的用例就是有一个基本类型LocalDate,我们希望将这个本地日期字段
JPA实现自定义类型(二)
今天继续昨天的内容,JPA实现一个自定义类型,昨天我们说了怎么实现一个基本类型,今天学习一个复杂一点的。我们的用例场景是将一个领域对象映射到一个类型,比如有一个PhoneNumber的对象,它包含三个字段分别是countryCode,cityCode,number,现在需要将这个对象映射到数据库,我们看怎么来实现:第一步,创建一个PhoneNumber类public class PhoneNumb
Spring hibernate JPA日志记录问题
今天我们来学习一下如何使用JPA的日志信息来记录执行的SQL语句,当然这里的SQL语句包括查询和修改。我们先了解一般情况下的SQL是如何记录的,看看下面的配置spring:
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: update
propertie
如何使用 Hibernate 5 访问数据库表元数据
在本文中,我们简单介绍如何在hibernate中访问数据库表的元数据。IntegratorHibernate 非常灵活,因此它定义了许多 SPI(服务提供者接口),您可以注册这些 SPI 以自定义 Hibernate 内部结构。其中一个接口是 org.hibernate.integrator.spi.Integrator,它被许多与 Hibernate ORM 集成的技术使用,比如 Bean Va
如何在没有 persistence.xml 配置文件的情况下以编程方式引导 JPA
上一篇我们知道了如何用编程的方式创建一个EntityManagerFactory;今天我们用另外一种更加通用方式来创建EntityManagerFactory。这种方式是基于标准的java持久化API。在上一节,我们用到了一个接口,这个类就是PersistenceUnitInfo,JPA 规范 PersistenceUnitInfo 接口封装了引导 EntityManagerFactory 所需的
没有persistence.xml初始化一个EntityManagerFactory
上一节我们介绍了通过persistence.xml初始化一个EntityManagerFactory;但是在很多种情况下是不需要使用xml配置文件来配置持久化单元的,因此,我们今天来学习如何通过编程来自动初始化一个EntityManagerFactoryHibernate早就为我们考虑到了这一点,它允许您完全以编程方式构建一个 EntityManagerFactory,只需几行代码:protect
Mockito and Fluent APIs
Fluent API 是一种基于方法链的软件工程设计技术,用于构建简洁、易读和健壮的接口。它们通常用于建造者、工厂和其他创造性的设计模式。最近,随着 Java 的发展,它们变得越来越流行,并且可以在 Java Stream API 和 Mockito 测试框架等流行的 API 中找到。然而,模拟 Fluent API 可能会很痛苦,因为我们经常需要设置一个复杂的模拟对象层次结构。在本文中,我们将看
Mockito ArgumentCaptor @Captor
Mockito ArgumentCaptor 用于捕获模拟方法的参数。ArgumentCaptor 与 Mockito verify() 方法一起使用,以在调用任何方法时获取传递的参数。这样,我们可以为我们的测试提供额外的 JUnit 断言。Mockito ArgumentCaptor我们可以为任何类创建 ArgumentCaptor 实例,然后它的 capture() 方法与 verify()
Mockito——Resetting Mock
Mockito 提供了重置Mock的功能,以便以后可以重用。看看下面的代码片段。//reset mock
reset(calcService);在这里,我们重置了Mock对象。 MathApplication 使用 calcService 并在重置模拟后,使用模拟方法将失败测试。举一个例子:// @RunWith attaches a runner with the test class to i
Mockito——回调
CallbackMockito 提供了一个 Answer 接口,它允许使用通用接口进行stubbing。语法//add the behavior to add numbers
when(calcService.add(20.0,10.0)).thenAnswer(new Answer<Double>() {
@Override
public Double answer(In
Mockito——创建Mock
Mock创建到目前为止,我们已经使用注解来创建Mock。 Mockito 提供了各种方法来创建模拟对象。 mock() 创建模拟,而不用担心Mock将在适当的时候进行的方法调用的顺序。创建语法:calcService = mock(CalculatorService.class);我们再来看看一个具体的例子:// @RunWith attaches a runner with the test c
Mockito基本测试功能
在上一篇中,我们知道了如何测试了如何验证mock的方法是否被调用,以及mock出来的方法的返回值等。今天我们继续讨论这些话题。预期调用计数Mockito 提供了以下附加方法来改变预期的调用计数atLeast (int min) - 期望最小调用。 atLeastOnce () - 至少需要一个调用。 atMost (int max) - 期望最大调用次数。我们看看代码的例子:/
Mockito整合JUnit
在本文中,我们将学习如何将 JUnit 和 Mockito 集成在一起。在这里,我们将创建一个数学应用程序,它使用 CalculatorService 执行基本的数学运算,例如加法、减法、乘法和除法。我们将使用 Mockito 来模拟 CalculatorService 的虚拟实现。此外,我们还广泛使用注解来展示它们与 JUnit 和 Mockito 的兼容性。下面将逐步讨论该过程。第 1 步 -
Mockito第一个demo
在深入了解 Mockito 框架的细节之前,让我们先看看一个正在运行的应用程序。在这个例子中,我们创建了一个股票服务的模拟来获取一些股票的虚拟价格,并对一个名为 Portfolio 的 java 类进行了单元测试。下面将逐步讨论该过程。第 1 步 - 创建一个 JAVA 类来表示股票Stock.javapublic class Stock {
private String stockId;
Mockito初步认识
Mockito 是一个模拟框架,基于 JAVA 的库,用于对 JAVA 应用程序进行有效的单元测试。Mockito 用于模拟接口,以便可以将虚拟功能添加到可用于单元测试的模拟接口中。本笔记将帮助您了解如何使用 Mockito 创建单元测试以及如何以简单直观的方式使用其 API。本系列文章适用于希望通过单元测试和测试驱动开发来提高软件质量的从新手到专家级别的 Java 开发人员。学习完成本系利文章后
函数的命令和查询分裂
上一节,我们知道了什么是命令,以及什么是查询。今天我们继续前面的例子,来试着将一个功能太多的函数进行命令和查询的分离。 /**
* 查询函数(用于设置值并返回)
*
*/
function configure(values) {
var config = { docRoot: '/somewhere' };
var
EventStorming
EventStorming 词汇表和备忘单EventStorming 是最智能的协作方法,它能打破孤立的边界。EventStorming的能力来自多元化、多学科的人群,他们共同拥有丰富的智慧和知识。它最初是为领域驱动设计聚合建模的研讨会发明的,但它现在具有更广泛的适用范围。从获得整个领域的全局问题空间到深入了解整个软件交付流程并制定长期规划。这些研讨会中的每一个都有相同的基本要求和需求。在这里,您
sinon最佳实践
我们对可测试js代码的学习已经有了一些理解,也分析了一些关于测试替身的问题,比如什么时候使用spies?什么时候使用stubs,什么时候使用mocks。今天我们用一个测试框架sinonjs来做具体的说明。简介测试使用了Ajax、网络、超时、数据库或其他依赖项的代码可能很困难。例如,如果您使用 Ajax 或网络,您需要有一个服务器来响应您的请求。使用数据库,您需要使用测试数据设置测试数据库。所有这一
js设计模式(抽象工厂和建造器)
什么是设计模式首先,需要了解设计模式的真正定义。作为软件开发人员,您可以“以任何方式”编写代码。但是,设计模式将是最佳实践,这将对您维护代码的方式产生重大影响。以最大的技巧编写的代码将比业余代码持续更长时间。这意味着当您选择正确的编码风格时,您无需担心可扩展性或维护。设计模式的作用是帮助您构建不会使整体问题复杂化的解决方案。模式将帮助您构建交互式对象和高度可重用的设计。设计模式是面向对象编程中不可
js设计模式(工厂,原型,单例)
我们知道,在设计模式中,创建型模式有五种,今天我们继续讨论剩下的模式。 工厂模式工厂的作用是生产具有相同特性的相似物体。这有助于轻松管理、维护和操作对象。例如,在我们的玩具工厂,每个玩具都会有一定的信息。它将包含购买日期、原产地和类别。这里我首先定义了一个玩具叫做StarWars,然后定义了一个玩具工厂,然后根据工厂函数创建一个具体的玩具。 var StarWars = fun
耦合
耦合上一节我们重点关注了扇出的内容,以及用例子说明了如何才能将一个函数或者模块的代码通过重构来达到一个合理的扇出值。今天我们来理解耦合:耦合是关注模块如何组合在一起的,增加子模块或许可以减少扇出的值,但是不能减少原始模块对最初依赖之间的耦合度;本质是将显示依赖变成了间接依赖。虽然今天我们不讲解内聚,但是我们也说说什么是内聚,以及什么是耦合? 内聚是从功能角度来度量模块内的联系,一个好的内
圈复杂度
圈复杂度圈复杂度是表示代码中独立现行路径的数量。举个例子:function sum(a, b) {
if (typeof(a) !== typeof(b)) {
throw new Error('Cannot sum different types');
} else {
return a + b;
}
}这个方法的圈复杂度就是2,也就是说需要测试两个分支,
什么是可测试代码
什么是可测试代码我们理解的可测试代码指的是:1、松耦合2、短小的3、可隔离的我们会依照这三个原则来分析,怎么样编写可测试的代码?一般来说,一个函数或者一个功能,如果越复杂,那么实现此功能需要的代码可能就会越多,代码量就会越多,出现潜在Bug的概率就越大。因此,编写可测试代码的第一步就是让函数或者功能保持最小代码量,而保持最小代码量的方法就是让命令(Command)和查询(Query)分离。我们首先
Injector框架理解(九)
上一节我们学习了关于didi依赖注入框架的关于组件和加载器作用域相关的使用,今天我们来了解一些初始化的一些使用。我们还是用一些例子来说明问题const { Injector } = require('didi');
const { expect } = require('chai');
const injector = new Injector([
{
__init__: [ 'foo' ]
Injector框架理解(八)
上一节我们学习了didi框架如何使用子加载器加载子模块的一些知识,还有包括初始化一些基本组件,今天我们继续学习相关的知识,还是从一个例子开始。const { Injector } = require('didi');
const { expect } = require('chai');
const injector = new Injector([
{
__exports__: [ 'foo
Injector框架理解(七)
上一节我们学习了didi依赖注入框架如何创建子加载器,以及如何加载子模块,今天我们继续使用例子来说明相关的内容:我们首先看看如下的例子:const {Injector} = require('didi');
const injector = new Injector([
{
__exports__: [ 'foo' ],
'foo': [
'fact
Injector框架理解(六)
上一节我们学习了didi依赖注入框架,如何使用模块,以及如何创建子依赖注入器,今天我们继续深入理解它们,先来看看第一个例子: const {Injector} = require('didi');
//定义一个父模块
const moduleParent = /** @type ModuleDeclaration */ ({
a: [ 'value', 'a-parent' ]
深入理解Mock,Stub
深入理解Mock,Stub前面我们学习了Mock,Stub的一些基础知识,今天我们深入理解一下:我们知道,单元测试最重要的工作就是破除依赖项(break dependency),破除依赖的技巧有好几个,如何使用这些技巧也是我们需要深入研究和学习的。首先需要指出的是破除依赖项的技巧有Mock类和Stub类。为了破除依赖项它们都可以说是伪造相关library界面的假物件,只是用途不一样而已:Stub:
Fakes,Mocks,Stubs的区别
Fakes,Mocks,Stubs的区别首先,本节的内容有一点偏理论,而且代码也不一定是用js来说明的,其次,理论的作用在于指导实践,因此我们后期的可测试js很多代码都会用到今天的理论知识,好了,开始吧。1、FakeFakes are objects that have working implementations, but not same as production one. Usually
Injector框架理解(五)
上一节我们学习了如何配置一个组件的依赖项,以及怎么配置属性组件,还有就是invoke方法的使用,今天我们继续学习依赖注入框架的另外一些知识,比如如何初始化组件。我们先来看看instantiate方法:const {Injector}= require('didi');
class Foo {
constructor(abc1, baz1) {
this.abc = abc1;
Injector框架理解(四)
上一节我们学习了配置一个组件的依赖项的两种方式,以及配置一个属性组件;今天我们来学习didi框架的另外一些功能,我们先看看代码:const {Injector} = require('didi');
function bar(baz, abc) {
return {
baz: baz,
abc: abc
};
}
bar.$inject = [ 'baz',
Injector框架理解(三)
上一节我们学习了didi框架的如何重用一个模块,以及依赖注入的数组式配置,今天我们继续学习如何配置依赖注入等。我们还是通过例子来说明使用方法const {Injector} = require('didi');
class FooType {
constructor() {
this.name = 'foo';
}
}
function barFactory(foo